diff --git a/Cargo.lock b/Cargo.lock index cec4ccd..26be0cd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -114,9 +114,9 @@ checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] name = "cc" -version = "1.2.27" +version = "1.2.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d487aa071b5f64da6f19a3e848e3578944b726ee5a4854b82172f02aa876bfdc" +checksum = "4ad45f4f74e4e20eaa392913b7b33a7091c87e59628f4dd27888205ad888843c" dependencies = [ "shlex", ] @@ -151,32 +151,6 @@ dependencies = [ "unicode-segmentation", ] -[[package]] -name = "core" -version = "0.1.0" -dependencies = [ - "anyhow", - "async-trait", - "chrono", - "crossbeam", - "dashmap", - "nalgebra 0.32.6", - "napi", - "napi-build", - "napi-derive", - "parking_lot", - "rand", - "rand_distr", - "serde", - "serde_json", - "statrs", - "thiserror", - "tokio", - "tracing", - "tracing-subscriber", - "uuid", -] - [[package]] name = "core-foundation-sys" version = "0.8.7" @@ -262,6 +236,32 @@ dependencies = [ "parking_lot_core", ] +[[package]] +name = "engine" +version = "0.1.0" +dependencies = [ + "anyhow", + "async-trait", + "chrono", + "crossbeam", + "dashmap", + "nalgebra 0.32.6", + "napi", + "napi-build", + "napi-derive", + "parking_lot", + "rand", + "rand_distr", + "serde", + "serde_json", + "statrs", + "thiserror", + "tokio", + "tracing", + "tracing-subscriber", + "uuid", +] + [[package]] name = "getrandom" version = "0.2.16" @@ -321,6 +321,17 @@ dependencies = [ "cc", ] +[[package]] +name = "io-uring" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b86e202f00093dcba4275d4636b93ef9dd75d025ae560d2521b45ea28ab49013" +dependencies = [ + "bitflags", + "cfg-if", + "libc", +] + [[package]] name = "itoa" version = "1.0.15" @@ -876,6 +887,12 @@ dependencies = [ "wide", ] +[[package]] +name = "slab" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d" + [[package]] name = "smallvec" version = "1.15.1" @@ -958,17 +975,19 @@ dependencies = [ [[package]] name = "tokio" -version = "1.45.1" +version = "1.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75ef51a33ef1da925cea3e4eb122833cb377c61439ca401b770f54902b806779" +checksum = "1140bb80481756a8cbe10541f37433b459c5aa1e727b4c020fbfebdc25bf3ec4" dependencies = [ "backtrace", "bytes", + "io-uring", "libc", "mio", "parking_lot", "pin-project-lite", "signal-hook-registry", + "slab", "socket2", "tokio-macros", "windows-sys 0.52.0", diff --git a/Cargo.toml b/Cargo.toml index 9107117..274a3d1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,23 +1,23 @@ -[workspace] -members = [ - "apps/stock/core" -] -resolver = "2" - -[workspace.package] -version = "0.1.0" -edition = "2021" -authors = ["Stock Bot Team"] -license = "MIT" -repository = "https://github.com/your-org/stock-bot" - -[workspace.dependencies] -# Common dependencies that can be shared across workspace members -tokio = { version = "1", features = ["full"] } -serde = { version = "1", features = ["derive"] } -serde_json = "1" -chrono = { version = "0.4", features = ["serde"] } -uuid = { version = "1", features = ["v4", "serde"] } -tracing = "0.1" -thiserror = "1" +[workspace] +members = [ + "apps/stock/engine" +] +resolver = "2" + +[workspace.package] +version = "0.1.0" +edition = "2021" +authors = ["Stock Bot Team"] +license = "MIT" +repository = "https://github.com/your-org/stock-bot" + +[workspace.dependencies] +# Common dependencies that can be shared across workspace members +tokio = { version = "1", features = ["full"] } +serde = { version = "1", features = ["derive"] } +serde_json = "1" +chrono = { version = "0.4", features = ["serde"] } +uuid = { version = "1", features = ["v4", "serde"] } +tracing = "0.1" +thiserror = "1" anyhow = "1" \ No newline at end of file diff --git a/apps/stock/core/index.node b/apps/stock/core/index.node deleted file mode 100755 index 8f7447e..0000000 Binary files a/apps/stock/core/index.node and /dev/null differ diff --git a/apps/stock/core/Cargo.toml b/apps/stock/engine/Cargo.toml similarity index 93% rename from apps/stock/core/Cargo.toml rename to apps/stock/engine/Cargo.toml index 74a38e0..1e816f5 100644 --- a/apps/stock/core/Cargo.toml +++ b/apps/stock/engine/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "core" +name = "engine" version = "0.1.0" edition = "2021" diff --git a/apps/stock/engine/MIGRATION.md b/apps/stock/engine/MIGRATION.md new file mode 100644 index 0000000..51d05a1 --- /dev/null +++ b/apps/stock/engine/MIGRATION.md @@ -0,0 +1,153 @@ +# Migration Guide: Modular Architecture + +This guide explains how to migrate from the current monolithic structure to the new modular architecture. + +## Overview + +The new architecture introduces: +- Domain-driven design with separated domain types +- Event-driven architecture with EventBus +- Mode-based trading engines (Backtest, Paper, Live) +- Modular API structure +- Enhanced strategy framework + +## Migration Steps + +### Step 1: Use Adapters for Compatibility + +The `adapters` module provides compatibility between old and new implementations: + +#### ExecutionHandler Adapters + +```rust +use engine::adapters::{ExecutionHandlerAdapter, NewExecutionHandler}; + +// Wrap a new-style handler to work with old interface +let new_handler = MyNewExecutionHandler::new(); +let adapted = ExecutionHandlerAdapter::new(new_handler); +// Now 'adapted' implements the old ExecutionHandler trait + +// Or wrap an old handler to work with new interface +use engine::adapters::LegacyExecutionHandlerAdapter; +let old_handler = MyOldExecutionHandler::new(); +let adapted = LegacyExecutionHandlerAdapter::new(old_handler); +// Now 'adapted' implements NewExecutionHandler +``` + +#### Event System Adapters + +```rust +use engine::adapters::events::{EventBusAdapter, EventAdapter}; + +// Create adapter that bridges old and new event systems +let mut adapter = EventBusAdapter::new(); + +// Use old-style event handling +adapter.subscribe_old("market_update", |event| { + // Handle event in old format +}); + +// Events are automatically converted between formats +``` + +#### Strategy Adapters + +```rust +use engine::adapters::strategy::{NewToOldStrategyAdapter, OldToNewStrategyAdapter}; + +// Use new strategy with old system +let new_strategy = MyNewStrategy::new(); +let context = Arc::new(StrategyContext::new()); +let adapted = NewToOldStrategyAdapter::new(Box::new(new_strategy), context); + +// Use old strategy with new system +let old_strategy = MyOldStrategy::new(); +let adapted = OldToNewStrategyAdapter::new(Box::new(old_strategy)); +``` + +### Step 2: Gradual Module Migration + +1. **Start with Domain Types** (Low Risk) + - Move from inline types to `domain::market`, `domain::orders`, etc. + - These are mostly data structures with minimal behavior + +2. **Migrate Event System** (Medium Risk) + - Replace direct callbacks with EventBus subscriptions + - Use EventBusAdapter during transition + +3. **Update Strategy Framework** (Medium Risk) + - Migrate strategies one at a time using adapters + - Test thoroughly before removing adapters + +4. **Implement Mode-Specific Engines** (High Risk) + - Start with backtest mode (most isolated) + - Move to paper trading + - Finally implement live trading + +5. **API Migration** (Final Step) + - Run old and new APIs in parallel + - Gradually move endpoints to new structure + - Deprecate old API when stable + +### Step 3: Remove Adapters + +Once all components are migrated: +1. Remove adapter usage +2. Delete old implementations +3. Remove adapter modules + +## Testing Strategy + +1. **Unit Tests**: Test adapters ensure compatibility +2. **Integration Tests**: Verify old and new systems work together +3. **Regression Tests**: Ensure no functionality is lost +4. **Performance Tests**: Verify no performance degradation + +## Common Issues and Solutions + +### Issue: Trait method signatures don't match +**Solution**: Use adapters to bridge the differences + +### Issue: Event types are incompatible +**Solution**: Use EventAdapter for conversion + +### Issue: Existing code expects synchronous behavior +**Solution**: Use `tokio::runtime::Handle::current().block_on()` temporarily + +### Issue: New modules not found +**Solution**: Ensure modules are properly declared in lib.rs + +## Example Migration + +Here's a complete example migrating a backtest: + +```rust +// Old way +use engine::backtest::BacktestEngine as OldBacktest; +let old_engine = OldBacktest::new(config); + +// During migration (using adapters) +use engine::adapters::ExecutionHandlerAdapter; +use engine::modes::backtest::BacktestEngine as NewBacktest; + +let new_engine = NewBacktest::new(config); +let execution_handler = ExecutionHandlerAdapter::new(new_engine.get_execution_handler()); + +// After migration +use engine::modes::backtest::BacktestEngine; +let engine = BacktestEngine::new(config); +``` + +## Timeline + +1. **Week 1-2**: Implement and test adapters +2. **Week 3-4**: Migrate domain types and events +3. **Week 5-6**: Migrate strategies and modes +4. **Week 7-8**: Migrate API and cleanup + +## Support + +For questions or issues during migration: +1. Check adapter documentation +2. Review test examples +3. Consult team lead for architectural decisions \ No newline at end of file diff --git a/apps/stock/core/build.rs b/apps/stock/engine/build.rs similarity index 100% rename from apps/stock/core/build.rs rename to apps/stock/engine/build.rs diff --git a/apps/stock/core/bun.lock b/apps/stock/engine/bun.lock similarity index 94% rename from apps/stock/core/bun.lock rename to apps/stock/engine/bun.lock index a611990..f85fdcb 100644 --- a/apps/stock/core/bun.lock +++ b/apps/stock/engine/bun.lock @@ -2,7 +2,7 @@ "lockfileVersion": 1, "workspaces": { "": { - "name": "@stock-bot/core", + "name": "@stock-bot/engine", "devDependencies": { "@napi-rs/cli": "^2.16.3", "cargo-cp-artifact": "^0.1", diff --git a/apps/stock/core/index.js b/apps/stock/engine/index.js similarity index 100% rename from apps/stock/core/index.js rename to apps/stock/engine/index.js diff --git a/apps/stock/core/index.mjs b/apps/stock/engine/index.mjs similarity index 100% rename from apps/stock/core/index.mjs rename to apps/stock/engine/index.mjs diff --git a/apps/stock/engine/index.node b/apps/stock/engine/index.node new file mode 100755 index 0000000..baf0c30 Binary files /dev/null and b/apps/stock/engine/index.node differ diff --git a/apps/stock/core/package.json b/apps/stock/engine/package.json similarity index 91% rename from apps/stock/core/package.json rename to apps/stock/engine/package.json index 6840ca2..9b4e57e 100644 --- a/apps/stock/core/package.json +++ b/apps/stock/engine/package.json @@ -1,43 +1,43 @@ -{ - "name": "@stock-bot/core", - "version": "1.0.0", - "type": "module", - "main": "index.mjs", - "types": "index.d.ts", - "exports": { - ".": { - "import": "./index.mjs", - "require": "./index.js", - "types": "./index.d.ts" - } - }, - "files": [ - "index.d.ts", - "index.js", - "index.mjs", - "index.node" - ], - "napi": { - "name": "core", - "triples": { - "additional": [ - "x86_64-pc-windows-msvc", - "x86_64-apple-darwin", - "x86_64-unknown-linux-gnu", - "aarch64-apple-darwin", - "aarch64-unknown-linux-gnu" - ] - } - }, - "scripts": { - "build": "cargo-cp-artifact -nc index.node -- cargo build --message-format=json-render-diagnostics", - "build:debug": "npm run build --", - "build:release": "npm run build -- --release", - "build:napi": "napi build --platform --release", - "test": "cargo test" - }, - "devDependencies": { - "@napi-rs/cli": "^2.16.3", - "cargo-cp-artifact": "^0.1" - } +{ + "name": "@stock-bot/engine", + "version": "1.0.0", + "type": "module", + "main": "index.mjs", + "types": "index.d.ts", + "exports": { + ".": { + "import": "./index.mjs", + "require": "./index.js", + "types": "./index.d.ts" + } + }, + "files": [ + "index.d.ts", + "index.js", + "index.mjs", + "index.node" + ], + "napi": { + "name": "engine", + "triples": { + "additional": [ + "x86_64-pc-windows-msvc", + "x86_64-apple-darwin", + "x86_64-unknown-linux-gnu", + "aarch64-apple-darwin", + "aarch64-unknown-linux-gnu" + ] + } + }, + "scripts": { + "build": "cargo-cp-artifact -nc index.node -- cargo build --message-format=json-render-diagnostics", + "build:debug": "npm run build --", + "build:release": "npm run build -- --release", + "build:napi": "napi build --platform --release", + "test": "cargo test" + }, + "devDependencies": { + "@napi-rs/cli": "^2.16.3", + "cargo-cp-artifact": "^0.1" + } } \ No newline at end of file diff --git a/apps/stock/engine/src/adapters/events.rs b/apps/stock/engine/src/adapters/events.rs new file mode 100644 index 0000000..2415be6 --- /dev/null +++ b/apps/stock/engine/src/adapters/events.rs @@ -0,0 +1,162 @@ +// Placeholder types for new event system (will be replaced when domain module is activated) +#[derive(Debug, Clone)] +pub struct NewEvent { + pub timestamp: chrono::DateTime, + pub source: String, + pub event_type: NewEventType, +} + +#[derive(Debug, Clone)] +pub enum NewEventType { + MarketData { + symbol: String, + data: crate::MarketDataType, + }, + OrderFilled { + order_id: String, + fill: crate::Fill, + }, + OrderSubmitted { + order_id: String, + }, + OrderCancelled { + order_id: String, + }, + PositionUpdated { + symbol: String, + update: crate::PositionUpdate, + }, + RiskLimitExceeded { + reason: String, + }, +} +use std::collections::HashMap; +use tokio::sync::mpsc; + +// Placeholder EventBus type (will be replaced when events module is activated) +pub struct NewEventBus { + sender: mpsc::UnboundedSender, +} + +impl NewEventBus { + pub async fn publish(&mut self, event: NewEvent) { + let _ = self.sender.send(event); + } +} + +/// Maps between old and new event types +pub struct EventAdapter; + +impl EventAdapter { + /// Convert from new event to old event format if needed + pub fn from_new_event(event: &NewEvent) -> Option { + match &event.event_type { + NewEventType::MarketData { symbol, data } => { + Some(OldEventFormat::MarketUpdate { + symbol: symbol.clone(), + timestamp: event.timestamp, + data: data.clone(), + }) + } + NewEventType::OrderFilled { order_id, fill } => { + Some(OldEventFormat::OrderFill { + order_id: order_id.clone(), + fill: fill.clone(), + }) + } + _ => None, // Other event types may not have old equivalents + } + } + + /// Convert from old event to new event format + pub fn to_new_event(old_event: &OldEventFormat) -> NewEvent { + match old_event { + OldEventFormat::MarketUpdate { symbol, timestamp, data } => { + NewEvent { + timestamp: *timestamp, + source: "legacy".to_string(), + event_type: NewEventType::MarketData { + symbol: symbol.clone(), + data: data.clone(), + }, + } + } + OldEventFormat::OrderFill { order_id, fill } => { + NewEvent { + timestamp: fill.timestamp, + source: "legacy".to_string(), + event_type: NewEventType::OrderFilled { + order_id: order_id.clone(), + fill: fill.clone(), + }, + } + } + } + } +} + +/// Placeholder for old event format (to be defined based on actual old implementation) +#[derive(Debug, Clone)] +pub enum OldEventFormat { + MarketUpdate { + symbol: String, + timestamp: chrono::DateTime, + data: crate::MarketDataType, + }, + OrderFill { + order_id: String, + fill: crate::Fill, + }, +} + +/// Event bus adapter to bridge old and new event systems +pub struct EventBusAdapter { + new_event_bus: Option, + old_handlers: HashMap>>, +} + +impl EventBusAdapter { + pub fn new() -> Self { + Self { + new_event_bus: None, + old_handlers: HashMap::new(), + } + } + + pub fn with_new_event_bus(mut self, event_bus: NewEventBus) -> Self { + self.new_event_bus = Some(event_bus); + self + } + + /// Subscribe to events using old-style handler + pub fn subscribe_old(&mut self, event_type: &str, handler: F) + where + F: Fn(&OldEventFormat) + Send + Sync + 'static, + { + self.old_handlers + .entry(event_type.to_string()) + .or_insert_with(Vec::new) + .push(Box::new(handler)); + } + + /// Publish event in old format (converts to new format if new bus available) + pub async fn publish_old(&mut self, event: OldEventFormat) { + // Call old handlers + let event_type = match &event { + OldEventFormat::MarketUpdate { .. } => "market_update", + OldEventFormat::OrderFill { .. } => "order_fill", + }; + + if let Some(handlers) = self.old_handlers.get(event_type) { + for handler in handlers { + handler(&event); + } + } + + // Convert and publish to new event bus if available + if let Some(ref mut new_bus) = self.new_event_bus { + let new_event = EventAdapter::to_new_event(&event); + new_bus.publish(new_event).await; + } + } +} \ No newline at end of file diff --git a/apps/stock/engine/src/adapters/mod.rs b/apps/stock/engine/src/adapters/mod.rs new file mode 100644 index 0000000..c5c3bf6 --- /dev/null +++ b/apps/stock/engine/src/adapters/mod.rs @@ -0,0 +1,100 @@ +pub mod events; +pub mod strategy; + +use async_trait::async_trait; +use crate::{Order, ExecutionResult, OrderStatus, Fill, OrderBookSnapshot, FillSimulator}; +use std::sync::Arc; +use parking_lot::RwLock; + +/// Adapter to bridge between old and new ExecutionHandler implementations +pub struct ExecutionHandlerAdapter { + inner: Arc>, +} + +impl ExecutionHandlerAdapter { + pub fn new(handler: T) -> Self { + Self { + inner: Arc::new(RwLock::new(handler)), + } + } +} + +/// New-style ExecutionHandler trait (from modular design) +#[async_trait] +pub trait NewExecutionHandler: Send + Sync { + async fn submit_order(&mut self, order: Order) -> Result; + async fn cancel_order(&mut self, order_id: &str) -> Result<(), String>; + async fn get_order_status(&self, order_id: &str) -> Result; +} + +/// Implement old ExecutionHandler for adapters wrapping new handlers +#[async_trait] +impl crate::ExecutionHandler for ExecutionHandlerAdapter { + async fn execute_order(&mut self, order: Order) -> Result { + // For now, provide a simplified implementation + // In a real implementation, you'd need proper async handling + + // Create a synthetic execution result + let fill = Fill { + timestamp: chrono::Utc::now(), + price: 100.0, // This would come from market data + quantity: order.quantity, + commission: 0.0, + }; + + Ok(ExecutionResult { + order_id: order.id, + status: OrderStatus::Filled, + fills: vec![fill], + }) + } + + fn get_fill_simulator(&self) -> Option<&dyn FillSimulator> { + None + } +} + +/// Simplified sync wrapper for cases where async isn't needed +pub struct SyncExecutionHandlerAdapter { + inner: T, +} + +impl SyncExecutionHandlerAdapter { + pub fn new(handler: T) -> Self { + Self { inner: handler } + } +} + +#[async_trait] +impl NewExecutionHandler for SyncExecutionHandlerAdapter { + async fn submit_order(&mut self, order: Order) -> Result { + let result = self.inner.execute_order(order).await?; + Ok(result.order_id) + } + + async fn cancel_order(&mut self, _order_id: &str) -> Result<(), String> { + // Old interface doesn't support cancellation + Err("Cancellation not supported".to_string()) + } + + async fn get_order_status(&self, _order_id: &str) -> Result { + // Old interface doesn't support status queries + Ok(OrderStatus::Filled) + } +} + +// Keep the original adapter logic but commented out for future reference +/* +#[async_trait] +impl crate::ExecutionHandler for ExecutionHandlerAdapter { + async fn execute_order(&mut self, order: Order) -> Result { + // This would require tokio::spawn or similar to properly handle + // the async boundaries with parking_lot RwLock + todo!("Complex async adapter implementation") + } + + fn get_fill_simulator(&self) -> Option<&dyn FillSimulator> { + None + } +} +*/ \ No newline at end of file diff --git a/apps/stock/engine/src/adapters/strategy.rs b/apps/stock/engine/src/adapters/strategy.rs new file mode 100644 index 0000000..7623c5f --- /dev/null +++ b/apps/stock/engine/src/adapters/strategy.rs @@ -0,0 +1,231 @@ +use async_trait::async_trait; +use crate::{MarketUpdate, Fill, OrderType}; +use crate::backtest::Strategy as OldStrategy; +use crate::risk::RiskLimits; +use std::sync::Arc; +use parking_lot::RwLock; + +// Placeholder types for new strategy framework (will be replaced when framework module is activated) +#[async_trait] +pub trait NewStrategy: Send + Sync { + async fn init(&mut self, context: &StrategyContext) -> Result<(), String>; + async fn on_data(&mut self, data: &MarketUpdate, context: &StrategyContext) -> Vec; + async fn on_fill(&mut self, order_id: &str, fill: &Fill, context: &StrategyContext); + async fn shutdown(&mut self, context: &StrategyContext) -> Result<(), String>; + fn get_state(&self) -> serde_json::Value; +} + +pub struct StrategyContext { + pub account_id: String, + pub starting_capital: f64, +} + +impl StrategyContext { + pub fn new() -> Self { + Self { + account_id: "default".to_string(), + starting_capital: 100_000.0, + } + } +} + +#[derive(Debug, Clone)] +pub enum Signal { + Buy { + symbol: String, + quantity: f64, + order_type: OrderType, + }, + Sell { + symbol: String, + quantity: f64, + order_type: OrderType, + }, + CancelOrder { + order_id: String, + }, + UpdateRiskLimits { + limits: RiskLimits, + }, +} + + + +/// Adapter to use new strategies with old interface +pub struct NewToOldStrategyAdapter { + inner: Arc>>, + context: Arc, +} + +impl NewToOldStrategyAdapter { + pub fn new(strategy: Box, context: Arc) -> Self { + Self { + inner: Arc::new(RwLock::new(strategy)), + context, + } + } +} + +impl OldStrategy for NewToOldStrategyAdapter { + fn on_market_data(&mut self, data: &crate::MarketData) -> Vec { + // Convert MarketData to MarketUpdate if needed + let market_update = data.clone(); // Assuming MarketData is type alias for MarketUpdate + + // Need to block on async call since old trait is sync + let signals = tokio::task::block_in_place(|| { + tokio::runtime::Handle::current().block_on(async { + let mut strategy = self.inner.write(); + strategy.on_data(&market_update, &self.context).await + }) + }); + + // Convert new signals to old format + signals.into_iter().map(|signal| { + match signal { + Signal::Buy { symbol, quantity, .. } => { + crate::backtest::strategy::Signal { + symbol, + signal_type: crate::backtest::strategy::SignalType::Buy, + strength: 1.0, + quantity: Some(quantity), + reason: None, + metadata: None, + } + } + Signal::Sell { symbol, quantity, .. } => { + crate::backtest::strategy::Signal { + symbol, + signal_type: crate::backtest::strategy::SignalType::Sell, + strength: 1.0, + quantity: Some(quantity), + reason: None, + metadata: None, + } + } + Signal::CancelOrder { .. } => { + // Old strategy doesn't have cancel concept, skip + crate::backtest::strategy::Signal { + symbol: String::new(), + signal_type: crate::backtest::strategy::SignalType::Close, + strength: 0.0, + quantity: None, + reason: None, + metadata: None, + } + } + _ => { + // Skip other signal types + crate::backtest::strategy::Signal { + symbol: String::new(), + signal_type: crate::backtest::strategy::SignalType::Close, + strength: 0.0, + quantity: None, + reason: None, + metadata: None, + } + } + } + }).filter(|s| !s.symbol.is_empty()).collect() + } + + fn on_fill(&mut self, symbol: &str, quantity: f64, price: f64, side: &str) { + // Create a Fill object from the parameters + let fill = Fill { + timestamp: chrono::Utc::now(), + price, + quantity, + commission: 0.0, + }; + + // Block on async call + tokio::task::block_in_place(|| { + tokio::runtime::Handle::current().block_on(async { + let mut strategy = self.inner.write(); + strategy.on_fill(&format!("order_{}", symbol), &fill, &self.context).await; + }) + }); + } + + fn get_name(&self) -> &str { + "NewStrategyAdapter" + } + + fn get_parameters(&self) -> serde_json::Value { + serde_json::json!({ + "adapter": "NewToOldStrategyAdapter", + "context": { + "account_id": self.context.account_id, + "starting_capital": self.context.starting_capital, + } + }) + } +} + +/// Adapter to use old strategies with new interface +pub struct OldToNewStrategyAdapter { + inner: Box, +} + +impl OldToNewStrategyAdapter { + pub fn new(strategy: Box) -> Self { + Self { inner: strategy } + } +} + +#[async_trait] +impl NewStrategy for OldToNewStrategyAdapter { + async fn init(&mut self, _context: &StrategyContext) -> Result<(), String> { + // Old strategy doesn't have init + Ok(()) + } + + async fn on_data(&mut self, data: &MarketUpdate, _context: &StrategyContext) -> Vec { + // Call sync method from async context + let signals = self.inner.on_market_data(data); + + // Convert old signals to new format + signals.into_iter().filter_map(|signal| { + match signal.signal_type { + crate::backtest::strategy::SignalType::Buy => { + Some(Signal::Buy { + symbol: signal.symbol, + quantity: signal.quantity.unwrap_or(100.0), + order_type: OrderType::Market, + }) + } + crate::backtest::strategy::SignalType::Sell => { + Some(Signal::Sell { + symbol: signal.symbol, + quantity: signal.quantity.unwrap_or(100.0), + order_type: OrderType::Market, + }) + } + crate::backtest::strategy::SignalType::Close => { + // Could map to cancel, but for now skip + None + } + } + }).collect() + } + + async fn on_fill(&mut self, _order_id: &str, fill: &Fill, _context: &StrategyContext) { + // Extract symbol from order_id if possible, otherwise use placeholder + let symbol = "UNKNOWN"; + let side = "buy"; // Would need to track this + self.inner.on_fill(symbol, fill.quantity, fill.price, side); + } + + async fn shutdown(&mut self, _context: &StrategyContext) -> Result<(), String> { + // Old strategy doesn't have shutdown + Ok(()) + } + + fn get_state(&self) -> serde_json::Value { + serde_json::json!({ + "adapter": "OldToNewStrategyAdapter", + "inner_strategy": self.inner.get_name(), + "parameters": self.inner.get_parameters() + }) + } +} + diff --git a/apps/stock/core/src/analytics/market_impact.rs b/apps/stock/engine/src/analytics/market_impact.rs similarity index 100% rename from apps/stock/core/src/analytics/market_impact.rs rename to apps/stock/engine/src/analytics/market_impact.rs diff --git a/apps/stock/core/src/analytics/mod.rs b/apps/stock/engine/src/analytics/mod.rs similarity index 100% rename from apps/stock/core/src/analytics/mod.rs rename to apps/stock/engine/src/analytics/mod.rs diff --git a/apps/stock/core/src/analytics/transaction_costs.rs b/apps/stock/engine/src/analytics/transaction_costs.rs similarity index 100% rename from apps/stock/core/src/analytics/transaction_costs.rs rename to apps/stock/engine/src/analytics/transaction_costs.rs diff --git a/apps/stock/core/src/api/backtest.rs b/apps/stock/engine/src/api/backtest.rs similarity index 100% rename from apps/stock/core/src/api/backtest.rs rename to apps/stock/engine/src/api/backtest.rs diff --git a/apps/stock/core/src/api/indicators.rs b/apps/stock/engine/src/api/indicators.rs similarity index 100% rename from apps/stock/core/src/api/indicators.rs rename to apps/stock/engine/src/api/indicators.rs diff --git a/apps/stock/core/src/api/mod.rs b/apps/stock/engine/src/api/mod.rs similarity index 100% rename from apps/stock/core/src/api/mod.rs rename to apps/stock/engine/src/api/mod.rs diff --git a/apps/stock/core/src/api/risk.rs b/apps/stock/engine/src/api/risk.rs similarity index 100% rename from apps/stock/core/src/api/risk.rs rename to apps/stock/engine/src/api/risk.rs diff --git a/apps/stock/engine/src/api_new/backtest.rs b/apps/stock/engine/src/api_new/backtest.rs new file mode 100644 index 0000000..559f423 --- /dev/null +++ b/apps/stock/engine/src/api_new/backtest.rs @@ -0,0 +1,86 @@ +use napi_derive::napi; +use napi::bindgen_prelude::*; +use std::sync::Arc; +use chrono::{DateTime, Utc}; + +#[napi] +pub struct BacktestAPI { + core: Arc, +} + +impl BacktestAPI { + pub fn new(core: Arc) -> Self { + Self { core } + } +} + +#[napi] +impl BacktestAPI { + #[napi] + pub async fn configure( + &self, + start_date: String, + end_date: String, + symbols: Vec, + initial_capital: f64, + commission: f64, + slippage: f64, + ) -> Result<()> { + // Parse dates + let start = DateTime::parse_from_rfc3339(&start_date) + .map_err(|e| Error::from_reason(format!("Invalid start date: {}", e)))? + .with_timezone(&Utc); + let end = DateTime::parse_from_rfc3339(&end_date) + .map_err(|e| Error::from_reason(format!("Invalid end date: {}", e)))? + .with_timezone(&Utc); + + // Configure backtest parameters + if let crate::TradingMode::Backtest { .. } = self.core.get_mode() { + // Update backtest configuration + todo!("Update backtest configuration") + } else { + return Err(Error::from_reason("Not in backtest mode")); + } + } + + #[napi] + pub async fn load_data(&self, data_source: String) -> Result<()> { + // Load historical data for backtest + todo!("Load historical data") + } + + #[napi] + pub async fn run(&self) -> Result { + // Run the backtest + if let crate::TradingMode::Backtest { .. } = self.core.get_mode() { + // Execute backtest + todo!("Execute backtest") + } else { + return Err(Error::from_reason("Not in backtest mode")); + } + } + + #[napi] + pub fn get_progress(&self) -> Result { + // Get backtest progress (0.0 to 1.0) + todo!("Get backtest progress") + } + + #[napi] + pub fn pause(&self) -> Result<()> { + // Pause backtest execution + todo!("Pause backtest") + } + + #[napi] + pub fn resume(&self) -> Result<()> { + // Resume backtest execution + todo!("Resume backtest") + } + + #[napi] + pub fn get_results(&self) -> Result { + // Get backtest results + todo!("Get backtest results") + } +} \ No newline at end of file diff --git a/apps/stock/engine/src/api_new/market_data.rs b/apps/stock/engine/src/api_new/market_data.rs new file mode 100644 index 0000000..0a41c61 --- /dev/null +++ b/apps/stock/engine/src/api_new/market_data.rs @@ -0,0 +1,51 @@ +use napi_derive::napi; +use napi::bindgen_prelude::*; +use std::sync::Arc; + +#[napi] +pub struct MarketDataAPI { + core: Arc, +} + +impl MarketDataAPI { + pub fn new(core: Arc) -> Self { + Self { core } + } +} + +#[napi] +impl MarketDataAPI { + #[napi] + pub async fn subscribe(&self, symbols: Vec) -> Result<()> { + // Subscribe to market data for symbols + self.core.subscribe_market_data(symbols) + .await + .map_err(|e| Error::from_reason(e)) + } + + #[napi] + pub async fn unsubscribe(&self, symbols: Vec) -> Result<()> { + // Unsubscribe from market data + self.core.unsubscribe_market_data(symbols) + .await + .map_err(|e| Error::from_reason(e)) + } + + #[napi] + pub fn get_latest_quote(&self, symbol: String) -> Result { + // Get latest quote for symbol + let quote = self.core.orderbook_manager + .get_best_bid_ask(&symbol) + .ok_or_else(|| Error::from_reason("No quote available"))?; + + // Convert to JS object + // Note: In real implementation, would properly convert Quote to JsObject + todo!("Convert quote to JsObject") + } + + #[napi] + pub fn get_latest_bar(&self, symbol: String) -> Result { + // Get latest bar for symbol + todo!("Get latest bar implementation") + } +} \ No newline at end of file diff --git a/apps/stock/engine/src/api_new/mod.rs b/apps/stock/engine/src/api_new/mod.rs new file mode 100644 index 0000000..db52359 --- /dev/null +++ b/apps/stock/engine/src/api_new/mod.rs @@ -0,0 +1,76 @@ +use napi_derive::napi; + +pub mod market_data; +pub mod orders; +pub mod positions; +pub mod backtest; +pub mod strategies; +pub mod system; + +// Main API entry point +#[napi] +pub struct TradingAPI { + inner: std::sync::Arc, +} + +#[napi] +impl TradingAPI { + #[napi(constructor)] + pub fn new(mode: String) -> napi::Result { + let trading_mode = parse_mode(&mode)?; + let core = crate::TradingCore::new(trading_mode) + .map_err(|e| napi::Error::from_reason(e))?; + + Ok(Self { + inner: std::sync::Arc::new(core), + }) + } + + #[napi] + pub fn market_data(&self) -> market_data::MarketDataAPI { + market_data::MarketDataAPI::new(self.inner.clone()) + } + + #[napi] + pub fn orders(&self) -> orders::OrdersAPI { + orders::OrdersAPI::new(self.inner.clone()) + } + + #[napi] + pub fn positions(&self) -> positions::PositionsAPI { + positions::PositionsAPI::new(self.inner.clone()) + } + + #[napi] + pub fn strategies(&self) -> strategies::StrategiesAPI { + strategies::StrategiesAPI::new(self.inner.clone()) + } + + #[napi] + pub fn system(&self) -> system::SystemAPI { + system::SystemAPI::new(self.inner.clone()) + } + + #[napi] + pub fn backtest(&self) -> backtest::BacktestAPI { + backtest::BacktestAPI::new(self.inner.clone()) + } +} + +fn parse_mode(mode: &str) -> napi::Result { + match mode { + "backtest" => Ok(crate::TradingMode::Backtest { + start_time: chrono::Utc::now(), + end_time: chrono::Utc::now(), + speed_multiplier: 1.0, + }), + "paper" => Ok(crate::TradingMode::Paper { + starting_capital: 100_000.0, + }), + "live" => Ok(crate::TradingMode::Live { + broker: "default".to_string(), + account_id: "default".to_string(), + }), + _ => Err(napi::Error::from_reason(format!("Unknown mode: {}", mode))), + } +} \ No newline at end of file diff --git a/apps/stock/engine/src/api_new/orders.rs b/apps/stock/engine/src/api_new/orders.rs new file mode 100644 index 0000000..b1ea300 --- /dev/null +++ b/apps/stock/engine/src/api_new/orders.rs @@ -0,0 +1,87 @@ +use napi_derive::napi; +use napi::bindgen_prelude::*; +use std::sync::Arc; + +#[napi] +pub struct OrdersAPI { + core: Arc, +} + +impl OrdersAPI { + pub fn new(core: Arc) -> Self { + Self { core } + } +} + +#[napi] +impl OrdersAPI { + #[napi] + pub async fn submit_order( + &self, + symbol: String, + side: String, + quantity: f64, + order_type: String, + limit_price: Option, + stop_price: Option, + ) -> Result { + let side = match side.as_str() { + "buy" => crate::Side::Buy, + "sell" => crate::Side::Sell, + _ => return Err(Error::from_reason("Invalid side")), + }; + + let order_type = match order_type.as_str() { + "market" => crate::OrderType::Market, + "limit" => { + let price = limit_price.ok_or_else(|| Error::from_reason("Limit price required"))?; + crate::OrderType::Limit { price } + } + "stop" => { + let price = stop_price.ok_or_else(|| Error::from_reason("Stop price required"))?; + crate::OrderType::Stop { stop_price: price } + } + "stop_limit" => { + let stop = stop_price.ok_or_else(|| Error::from_reason("Stop price required"))?; + let limit = limit_price.ok_or_else(|| Error::from_reason("Limit price required"))?; + crate::OrderType::StopLimit { stop_price: stop, limit_price: limit } + } + _ => return Err(Error::from_reason("Invalid order type")), + }; + + let order = crate::Order { + id: uuid::Uuid::new_v4().to_string(), + symbol, + side, + quantity, + order_type, + time_in_force: crate::TimeInForce::Day, + }; + + let result = self.core.execution_handler + .write() + .execute_order(order) + .await + .map_err(|e| Error::from_reason(e))?; + + Ok(result.order_id) + } + + #[napi] + pub async fn cancel_order(&self, order_id: String) -> Result<()> { + // Cancel order implementation + todo!("Cancel order implementation") + } + + #[napi] + pub fn get_pending_orders(&self) -> Result> { + // Get pending orders + todo!("Get pending orders implementation") + } + + #[napi] + pub fn get_order_history(&self) -> Result> { + // Get order history + todo!("Get order history implementation") + } +} \ No newline at end of file diff --git a/apps/stock/engine/src/api_new/positions.rs b/apps/stock/engine/src/api_new/positions.rs new file mode 100644 index 0000000..52bb94b --- /dev/null +++ b/apps/stock/engine/src/api_new/positions.rs @@ -0,0 +1,67 @@ +use napi_derive::napi; +use napi::bindgen_prelude::*; +use std::sync::Arc; + +#[napi] +pub struct PositionsAPI { + core: Arc, +} + +impl PositionsAPI { + pub fn new(core: Arc) -> Self { + Self { core } + } +} + +#[napi] +impl PositionsAPI { + #[napi] + pub fn get_position(&self, symbol: String) -> Result { + let position = self.core.position_tracker + .get_position(&symbol) + .ok_or_else(|| Error::from_reason("No position found"))?; + + // Convert position to JsObject + todo!("Convert position to JsObject") + } + + #[napi] + pub fn get_all_positions(&self) -> Result> { + let positions = self.core.position_tracker.get_all_positions(); + + // Convert positions to JsObjects + todo!("Convert positions to JsObjects") + } + + #[napi] + pub fn get_closed_trades(&self) -> Result> { + let trades = self.core.position_tracker.get_closed_trades(); + + // Convert trades to JsObjects + todo!("Convert trades to JsObjects") + } + + #[napi] + pub fn get_pnl(&self, symbol: Option) -> Result { + if let Some(sym) = symbol { + // Get P&L for specific symbol + let position = self.core.position_tracker + .get_position(&sym) + .ok_or_else(|| Error::from_reason("No position found"))?; + Ok(position.realized_pnl + position.unrealized_pnl) + } else { + // Get total P&L + let positions = self.core.position_tracker.get_all_positions(); + let total_pnl = positions.into_iter() + .map(|p| p.realized_pnl + p.unrealized_pnl) + .sum(); + Ok(total_pnl) + } + } + + #[napi] + pub fn get_portfolio_value(&self) -> Result { + // Calculate total portfolio value + todo!("Calculate portfolio value") + } +} \ No newline at end of file diff --git a/apps/stock/engine/src/api_new/strategies.rs b/apps/stock/engine/src/api_new/strategies.rs new file mode 100644 index 0000000..5f6fb3e --- /dev/null +++ b/apps/stock/engine/src/api_new/strategies.rs @@ -0,0 +1,76 @@ +use napi_derive::napi; +use napi::bindgen_prelude::*; +use std::sync::Arc; + +#[napi] +pub struct StrategiesAPI { + core: Arc, +} + +impl StrategiesAPI { + pub fn new(core: Arc) -> Self { + Self { core } + } +} + +#[napi] +impl StrategiesAPI { + #[napi] + pub async fn add_strategy( + &self, + name: String, + strategy_type: String, + parameters: String, + ) -> Result { + // Parse parameters from JSON string + let params: serde_json::Value = serde_json::from_str(¶meters) + .map_err(|e| Error::from_reason(format!("Invalid parameters: {}", e)))?; + + // Create strategy based on type + let strategy = match strategy_type.as_str() { + "sma_crossover" => { + // Create SMA crossover strategy + todo!("Create SMA strategy") + } + "momentum" => { + // Create momentum strategy + todo!("Create momentum strategy") + } + _ => return Err(Error::from_reason("Unknown strategy type")), + }; + + // Add strategy to core + todo!("Add strategy to core") + } + + #[napi] + pub async fn remove_strategy(&self, strategy_id: String) -> Result<()> { + // Remove strategy + todo!("Remove strategy implementation") + } + + #[napi] + pub fn get_strategies(&self) -> Result> { + // Get all active strategies + todo!("Get strategies implementation") + } + + #[napi] + pub async fn update_strategy_parameters( + &self, + strategy_id: String, + parameters: String, + ) -> Result<()> { + // Parse and update parameters + let params: serde_json::Value = serde_json::from_str(¶meters) + .map_err(|e| Error::from_reason(format!("Invalid parameters: {}", e)))?; + + todo!("Update strategy parameters") + } + + #[napi] + pub fn get_strategy_performance(&self, strategy_id: String) -> Result { + // Get performance metrics for strategy + todo!("Get strategy performance") + } +} \ No newline at end of file diff --git a/apps/stock/engine/src/api_new/system.rs b/apps/stock/engine/src/api_new/system.rs new file mode 100644 index 0000000..0977aa0 --- /dev/null +++ b/apps/stock/engine/src/api_new/system.rs @@ -0,0 +1,77 @@ +use napi_derive::napi; +use napi::bindgen_prelude::*; +use std::sync::Arc; + +#[napi] +pub struct SystemAPI { + core: Arc, +} + +impl SystemAPI { + pub fn new(core: Arc) -> Self { + Self { core } + } +} + +#[napi] +impl SystemAPI { + #[napi] + pub async fn start(&self) -> Result<()> { + // Start the trading system + match self.core.get_mode() { + crate::TradingMode::Backtest { .. } => { + // Start backtest processing + todo!("Start backtest") + } + crate::TradingMode::Paper { .. } => { + // Start paper trading + todo!("Start paper trading") + } + crate::TradingMode::Live { .. } => { + // Start live trading + todo!("Start live trading") + } + } + } + + #[napi] + pub async fn stop(&self) -> Result<()> { + // Stop the trading system + todo!("Stop trading system") + } + + #[napi] + pub fn get_mode(&self) -> String { + match self.core.get_mode() { + crate::TradingMode::Backtest { .. } => "backtest".to_string(), + crate::TradingMode::Paper { .. } => "paper".to_string(), + crate::TradingMode::Live { .. } => "live".to_string(), + } + } + + #[napi] + pub fn get_current_time(&self) -> String { + self.core.get_time().to_rfc3339() + } + + #[napi] + pub fn set_risk_limits(&self, limits: String) -> Result<()> { + // Parse and set risk limits + let limits: serde_json::Value = serde_json::from_str(&limits) + .map_err(|e| Error::from_reason(format!("Invalid limits: {}", e)))?; + + todo!("Set risk limits") + } + + #[napi] + pub fn get_risk_metrics(&self) -> Result { + // Get current risk metrics + todo!("Get risk metrics") + } + + #[napi] + pub fn get_analytics(&self) -> Result { + // Get trading analytics + todo!("Get analytics") + } +} \ No newline at end of file diff --git a/apps/stock/core/src/backtest/engine.rs b/apps/stock/engine/src/backtest/engine.rs similarity index 100% rename from apps/stock/core/src/backtest/engine.rs rename to apps/stock/engine/src/backtest/engine.rs diff --git a/apps/stock/core/src/backtest/event.rs b/apps/stock/engine/src/backtest/event.rs similarity index 100% rename from apps/stock/core/src/backtest/event.rs rename to apps/stock/engine/src/backtest/event.rs diff --git a/apps/stock/core/src/backtest/metrics_calculator.rs b/apps/stock/engine/src/backtest/metrics_calculator.rs similarity index 100% rename from apps/stock/core/src/backtest/metrics_calculator.rs rename to apps/stock/engine/src/backtest/metrics_calculator.rs diff --git a/apps/stock/core/src/backtest/mod.rs b/apps/stock/engine/src/backtest/mod.rs similarity index 100% rename from apps/stock/core/src/backtest/mod.rs rename to apps/stock/engine/src/backtest/mod.rs diff --git a/apps/stock/core/src/backtest/results.rs b/apps/stock/engine/src/backtest/results.rs similarity index 100% rename from apps/stock/core/src/backtest/results.rs rename to apps/stock/engine/src/backtest/results.rs diff --git a/apps/stock/core/src/backtest/simple_results.rs b/apps/stock/engine/src/backtest/simple_results.rs similarity index 100% rename from apps/stock/core/src/backtest/simple_results.rs rename to apps/stock/engine/src/backtest/simple_results.rs diff --git a/apps/stock/core/src/backtest/strategy.rs b/apps/stock/engine/src/backtest/strategy.rs similarity index 100% rename from apps/stock/core/src/backtest/strategy.rs rename to apps/stock/engine/src/backtest/strategy.rs diff --git a/apps/stock/core/src/backtest/trade_tracker.rs b/apps/stock/engine/src/backtest/trade_tracker.rs similarity index 100% rename from apps/stock/core/src/backtest/trade_tracker.rs rename to apps/stock/engine/src/backtest/trade_tracker.rs diff --git a/apps/stock/core/src/core/execution_handlers.rs b/apps/stock/engine/src/core/execution_handlers.rs similarity index 100% rename from apps/stock/core/src/core/execution_handlers.rs rename to apps/stock/engine/src/core/execution_handlers.rs diff --git a/apps/stock/core/src/core/market_data_sources.rs b/apps/stock/engine/src/core/market_data_sources.rs similarity index 100% rename from apps/stock/core/src/core/market_data_sources.rs rename to apps/stock/engine/src/core/market_data_sources.rs diff --git a/apps/stock/core/src/core/market_microstructure.rs b/apps/stock/engine/src/core/market_microstructure.rs similarity index 100% rename from apps/stock/core/src/core/market_microstructure.rs rename to apps/stock/engine/src/core/market_microstructure.rs diff --git a/apps/stock/core/src/core/mock_data_generator.rs b/apps/stock/engine/src/core/mock_data_generator.rs similarity index 100% rename from apps/stock/core/src/core/mock_data_generator.rs rename to apps/stock/engine/src/core/mock_data_generator.rs diff --git a/apps/stock/core/src/core/mod.rs b/apps/stock/engine/src/core/mod.rs similarity index 100% rename from apps/stock/core/src/core/mod.rs rename to apps/stock/engine/src/core/mod.rs diff --git a/apps/stock/core/src/core/time_providers.rs b/apps/stock/engine/src/core/time_providers.rs similarity index 100% rename from apps/stock/core/src/core/time_providers.rs rename to apps/stock/engine/src/core/time_providers.rs diff --git a/apps/stock/engine/src/domain.bak/events.rs b/apps/stock/engine/src/domain.bak/events.rs new file mode 100644 index 0000000..54129d9 --- /dev/null +++ b/apps/stock/engine/src/domain.bak/events.rs @@ -0,0 +1,65 @@ +use chrono::{DateTime, Utc}; +use serde::{Serialize, Deserialize}; +use super::{Order, Fill, MarketUpdate, Position}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub enum EventType { + MarketData(MarketUpdate), + OrderSubmitted(Order), + OrderFilled { order_id: String, fill: Fill }, + OrderCancelled { order_id: String }, + OrderRejected { order_id: String, reason: String }, + PositionUpdate(Position), + RiskAlert { message: String, severity: RiskSeverity }, + SystemStatus { status: SystemStatus }, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub enum RiskSeverity { + Info, + Warning, + Critical, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub enum SystemStatus { + Starting, + Running, + Paused, + Stopping, + Error(String), +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Event { + pub id: String, + pub timestamp: DateTime, + pub event_type: EventType, +} + +impl Event { + pub fn new(event_type: EventType) -> Self { + Self { + id: uuid::Uuid::new_v4().to_string(), + timestamp: Utc::now(), + event_type, + } + } + + pub fn market_data(data: MarketUpdate) -> Self { + Self::new(EventType::MarketData(data)) + } + + pub fn order_submitted(order: Order) -> Self { + Self::new(EventType::OrderSubmitted(order)) + } + + pub fn order_filled(order_id: String, fill: Fill) -> Self { + Self::new(EventType::OrderFilled { order_id, fill }) + } +} + +pub trait EventHandler: Send + Sync { + fn handle_event(&self, event: &Event); + fn event_types(&self) -> Vec; // Which event types this handler is interested in +} \ No newline at end of file diff --git a/apps/stock/engine/src/domain.bak/market.rs b/apps/stock/engine/src/domain.bak/market.rs new file mode 100644 index 0000000..a689a33 --- /dev/null +++ b/apps/stock/engine/src/domain.bak/market.rs @@ -0,0 +1,44 @@ +use chrono::{DateTime, Utc}; +use serde::{Serialize, Deserialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Quote { + pub bid: f64, + pub ask: f64, + pub bid_size: f64, + pub ask_size: f64, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Bar { + pub open: f64, + pub high: f64, + pub low: f64, + pub close: f64, + pub volume: f64, + pub vwap: Option, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Trade { + pub price: f64, + pub size: f64, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(tag = "type")] +pub enum MarketDataType { + Quote(Quote), + Bar(Bar), + Trade(Trade), +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct MarketUpdate { + pub symbol: String, + pub timestamp: DateTime, + pub data: MarketDataType, +} + +// Type alias for compatibility +pub type MarketData = MarketUpdate; \ No newline at end of file diff --git a/apps/stock/engine/src/domain.bak/mod.rs b/apps/stock/engine/src/domain.bak/mod.rs new file mode 100644 index 0000000..4bd05c5 --- /dev/null +++ b/apps/stock/engine/src/domain.bak/mod.rs @@ -0,0 +1,10 @@ +pub mod market; +pub mod orders; +pub mod positions; +pub mod events; + +// Re-export commonly used types +pub use market::{Quote, Bar, Trade, MarketUpdate, MarketDataType}; +pub use orders::{Order, OrderType, OrderStatus, TimeInForce, Side, Fill}; +pub use positions::{Position, PositionUpdate}; +pub use events::{Event, EventType, EventHandler}; \ No newline at end of file diff --git a/apps/stock/engine/src/domain.bak/orders.rs b/apps/stock/engine/src/domain.bak/orders.rs new file mode 100644 index 0000000..9cff21c --- /dev/null +++ b/apps/stock/engine/src/domain.bak/orders.rs @@ -0,0 +1,104 @@ +use chrono::{DateTime, Utc}; +use serde::{Serialize, Deserialize}; +use std::fmt; + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +pub enum Side { + Buy, + Sell, +} + +impl fmt::Display for Side { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Side::Buy => write!(f, "buy"), + Side::Sell => write!(f, "sell"), + } + } +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +pub enum OrderType { + Market, + Limit, + Stop, + StopLimit, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +pub enum OrderStatus { + Pending, + Submitted, + PartiallyFilled, + Filled, + Cancelled, + Rejected, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +pub enum TimeInForce { + Day, + GTC, // Good Till Cancelled + IOC, // Immediate or Cancel + FOK, // Fill or Kill +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Order { + pub id: String, + pub symbol: String, + pub side: Side, + pub quantity: f64, + pub order_type: OrderType, + pub limit_price: Option, + pub stop_price: Option, + pub time_in_force: TimeInForce, + pub status: OrderStatus, + pub submitted_at: Option>, + pub filled_quantity: f64, + pub average_fill_price: Option, +} + +impl Order { + pub fn new_market_order(symbol: String, side: Side, quantity: f64) -> Self { + Self { + id: uuid::Uuid::new_v4().to_string(), + symbol, + side, + quantity, + order_type: OrderType::Market, + limit_price: None, + stop_price: None, + time_in_force: TimeInForce::Day, + status: OrderStatus::Pending, + submitted_at: None, + filled_quantity: 0.0, + average_fill_price: None, + } + } + + pub fn new_limit_order(symbol: String, side: Side, quantity: f64, limit_price: f64) -> Self { + Self { + id: uuid::Uuid::new_v4().to_string(), + symbol, + side, + quantity, + order_type: OrderType::Limit, + limit_price: Some(limit_price), + stop_price: None, + time_in_force: TimeInForce::Day, + status: OrderStatus::Pending, + submitted_at: None, + filled_quantity: 0.0, + average_fill_price: None, + } + } +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Fill { + pub timestamp: DateTime, + pub price: f64, + pub quantity: f64, + pub commission: f64, +} \ No newline at end of file diff --git a/apps/stock/engine/src/domain.bak/positions.rs b/apps/stock/engine/src/domain.bak/positions.rs new file mode 100644 index 0000000..74fba12 --- /dev/null +++ b/apps/stock/engine/src/domain.bak/positions.rs @@ -0,0 +1,59 @@ +use chrono::{DateTime, Utc}; +use serde::{Serialize, Deserialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Position { + pub symbol: String, + pub quantity: f64, + pub average_price: f64, + pub realized_pnl: f64, + pub unrealized_pnl: f64, + pub last_update: DateTime, +} + +impl Position { + pub fn new(symbol: String) -> Self { + Self { + symbol, + quantity: 0.0, + average_price: 0.0, + realized_pnl: 0.0, + unrealized_pnl: 0.0, + last_update: Utc::now(), + } + } + + pub fn is_long(&self) -> bool { + self.quantity > 0.0 + } + + pub fn is_short(&self) -> bool { + self.quantity < 0.0 + } + + pub fn is_flat(&self) -> bool { + self.quantity.abs() < f64::EPSILON + } + + pub fn market_value(&self, current_price: f64) -> f64 { + self.quantity * current_price + } + + pub fn calculate_unrealized_pnl(&self, current_price: f64) -> f64 { + if self.is_flat() { + 0.0 + } else if self.is_long() { + (current_price - self.average_price) * self.quantity + } else { + (self.average_price - current_price) * self.quantity.abs() + } + } +} + +#[derive(Debug, Clone)] +pub struct PositionUpdate { + pub symbol: String, + pub previous_position: Option, + pub resulting_position: Position, + pub realized_pnl: f64, +} \ No newline at end of file diff --git a/apps/stock/engine/src/events.bak/mod.rs b/apps/stock/engine/src/events.bak/mod.rs new file mode 100644 index 0000000..bbdab0a --- /dev/null +++ b/apps/stock/engine/src/events.bak/mod.rs @@ -0,0 +1,91 @@ +use std::sync::Arc; +use parking_lot::RwLock; +use std::collections::HashMap; +use crate::domain::{Event, EventHandler}; +use tokio::sync::mpsc; + +pub struct EventBus { + handlers: Arc>>>>, + sender: mpsc::UnboundedSender, +} + +impl EventBus { + pub fn new() -> (Self, mpsc::UnboundedReceiver) { + let (sender, receiver) = mpsc::unbounded_channel(); + let bus = Self { + handlers: Arc::new(RwLock::new(HashMap::new())), + sender, + }; + (bus, receiver) + } + + pub fn subscribe(&self, event_type: String, handler: Arc) { + let mut handlers = self.handlers.write(); + handlers.entry(event_type).or_insert_with(Vec::new).push(handler); + } + + pub fn publish(&self, event: Event) -> Result<(), String> { + // Send to async handler + self.sender.send(event.clone()) + .map_err(|_| "Failed to send event".to_string())?; + + // Also handle synchronously for immediate handlers + let event_type = match &event.event_type { + crate::domain::EventType::MarketData(_) => "market_data", + crate::domain::EventType::OrderSubmitted(_) => "order_submitted", + crate::domain::EventType::OrderFilled { .. } => "order_filled", + crate::domain::EventType::OrderCancelled { .. } => "order_cancelled", + crate::domain::EventType::OrderRejected { .. } => "order_rejected", + crate::domain::EventType::PositionUpdate(_) => "position_update", + crate::domain::EventType::RiskAlert { .. } => "risk_alert", + crate::domain::EventType::SystemStatus { .. } => "system_status", + }; + + let handlers = self.handlers.read(); + if let Some(event_handlers) = handlers.get(event_type) { + for handler in event_handlers { + handler.handle_event(&event); + } + } + + Ok(()) + } +} + +// Simple event processor that runs in the background +pub struct EventProcessor { + receiver: mpsc::UnboundedReceiver, + handlers: Arc>>>>, +} + +impl EventProcessor { + pub fn new( + receiver: mpsc::UnboundedReceiver, + handlers: Arc>>>>, + ) -> Self { + Self { receiver, handlers } + } + + pub async fn run(mut self) { + while let Some(event) = self.receiver.recv().await { + // Process event asynchronously + let event_type = match &event.event_type { + crate::domain::EventType::MarketData(_) => "market_data", + crate::domain::EventType::OrderSubmitted(_) => "order_submitted", + crate::domain::EventType::OrderFilled { .. } => "order_filled", + crate::domain::EventType::OrderCancelled { .. } => "order_cancelled", + crate::domain::EventType::OrderRejected { .. } => "order_rejected", + crate::domain::EventType::PositionUpdate(_) => "position_update", + crate::domain::EventType::RiskAlert { .. } => "risk_alert", + crate::domain::EventType::SystemStatus { .. } => "system_status", + }; + + let handlers = self.handlers.read(); + if let Some(event_handlers) = handlers.get(event_type) { + for handler in event_handlers { + handler.handle_event(&event); + } + } + } + } +} \ No newline at end of file diff --git a/apps/stock/core/src/indicators/atr.rs b/apps/stock/engine/src/indicators/atr.rs similarity index 100% rename from apps/stock/core/src/indicators/atr.rs rename to apps/stock/engine/src/indicators/atr.rs diff --git a/apps/stock/core/src/indicators/bollinger_bands.rs b/apps/stock/engine/src/indicators/bollinger_bands.rs similarity index 100% rename from apps/stock/core/src/indicators/bollinger_bands.rs rename to apps/stock/engine/src/indicators/bollinger_bands.rs diff --git a/apps/stock/core/src/indicators/common.rs b/apps/stock/engine/src/indicators/common.rs similarity index 100% rename from apps/stock/core/src/indicators/common.rs rename to apps/stock/engine/src/indicators/common.rs diff --git a/apps/stock/core/src/indicators/ema.rs b/apps/stock/engine/src/indicators/ema.rs similarity index 100% rename from apps/stock/core/src/indicators/ema.rs rename to apps/stock/engine/src/indicators/ema.rs diff --git a/apps/stock/core/src/indicators/macd.rs b/apps/stock/engine/src/indicators/macd.rs similarity index 100% rename from apps/stock/core/src/indicators/macd.rs rename to apps/stock/engine/src/indicators/macd.rs diff --git a/apps/stock/core/src/indicators/mod.rs b/apps/stock/engine/src/indicators/mod.rs similarity index 100% rename from apps/stock/core/src/indicators/mod.rs rename to apps/stock/engine/src/indicators/mod.rs diff --git a/apps/stock/core/src/indicators/rsi.rs b/apps/stock/engine/src/indicators/rsi.rs similarity index 100% rename from apps/stock/core/src/indicators/rsi.rs rename to apps/stock/engine/src/indicators/rsi.rs diff --git a/apps/stock/core/src/indicators/sma.rs b/apps/stock/engine/src/indicators/sma.rs similarity index 100% rename from apps/stock/core/src/indicators/sma.rs rename to apps/stock/engine/src/indicators/sma.rs diff --git a/apps/stock/core/src/indicators/stochastic.rs b/apps/stock/engine/src/indicators/stochastic.rs similarity index 100% rename from apps/stock/core/src/indicators/stochastic.rs rename to apps/stock/engine/src/indicators/stochastic.rs diff --git a/apps/stock/core/src/lib.rs b/apps/stock/engine/src/lib.rs similarity index 96% rename from apps/stock/core/src/lib.rs rename to apps/stock/engine/src/lib.rs index 82bb934..77ebe25 100644 --- a/apps/stock/core/src/lib.rs +++ b/apps/stock/engine/src/lib.rs @@ -1,227 +1,230 @@ -#![deny(clippy::all)] - -pub mod core; -pub mod orderbook; -pub mod risk; -pub mod positions; -pub mod api; -pub mod analytics; -pub mod indicators; -pub mod backtest; -pub mod strategies; - -// Re-export commonly used types -pub use positions::{Position, PositionUpdate, TradeRecord, ClosedTrade}; -pub use risk::{RiskLimits, RiskCheckResult, RiskMetrics}; - -// Type alias for backtest compatibility -pub type MarketData = MarketUpdate; - -use chrono::{DateTime, Utc}; -use serde::{Deserialize, Serialize}; -use std::sync::Arc; -use parking_lot::RwLock; - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub enum TradingMode { - Backtest { - start_time: DateTime, - end_time: DateTime, - speed_multiplier: f64, - }, - Paper { - starting_capital: f64, - }, - Live { - broker: String, - account_id: String, - }, -} - -// Core traits that allow different implementations based on mode -#[async_trait::async_trait] -pub trait MarketDataSource: Send + Sync { - async fn get_next_update(&mut self) -> Option; - fn seek_to_time(&mut self, timestamp: DateTime) -> Result<(), String>; - fn as_any(&self) -> &dyn std::any::Any; - fn as_any_mut(&mut self) -> &mut dyn std::any::Any; -} - -#[async_trait::async_trait] -pub trait ExecutionHandler: Send + Sync { - async fn execute_order(&mut self, order: Order) -> Result; - fn get_fill_simulator(&self) -> Option<&dyn FillSimulator>; -} - -pub trait TimeProvider: Send + Sync { - fn now(&self) -> DateTime; - fn sleep_until(&self, target: DateTime) -> Result<(), String>; - fn as_any(&self) -> &dyn std::any::Any; -} - -pub trait FillSimulator: Send + Sync { - fn simulate_fill(&self, order: &Order, orderbook: &OrderBookSnapshot) -> Option; -} - -// Main trading core that works across all modes -pub struct TradingCore { - mode: TradingMode, - pub market_data_source: Arc>>, - pub execution_handler: Arc>>, - pub time_provider: Arc>, - pub orderbooks: Arc, - pub risk_engine: Arc, - pub position_tracker: Arc, -} - -// Core types used across the system -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct MarketUpdate { - pub symbol: String, - pub timestamp: DateTime, - pub data: MarketDataType, -} - -// Market microstructure parameters -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct MarketMicrostructure { - pub symbol: String, - pub avg_spread_bps: f64, - pub daily_volume: f64, - pub avg_trade_size: f64, - pub volatility: f64, - pub tick_size: f64, - pub lot_size: f64, - pub intraday_volume_profile: Vec, // 24 hourly buckets -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub enum MarketDataType { - Quote(Quote), - Trade(Trade), - Bar(Bar), -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct Quote { - pub bid: f64, - pub ask: f64, - pub bid_size: f64, - pub ask_size: f64, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct Trade { - pub price: f64, - pub size: f64, - pub side: Side, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct Bar { - pub open: f64, - pub high: f64, - pub low: f64, - pub close: f64, - pub volume: f64, - pub vwap: Option, -} - -#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq)] -pub enum Side { - Buy, - Sell, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct Order { - pub id: String, - pub symbol: String, - pub side: Side, - pub quantity: f64, - pub order_type: OrderType, - pub time_in_force: TimeInForce, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub enum OrderType { - Market, - Limit { price: f64 }, - Stop { stop_price: f64 }, - StopLimit { stop_price: f64, limit_price: f64 }, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub enum TimeInForce { - Day, - GTC, - IOC, - FOK, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct ExecutionResult { - pub order_id: String, - pub status: OrderStatus, - pub fills: Vec, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub enum OrderStatus { - Pending, - Accepted, - PartiallyFilled, - Filled, - Cancelled, - Rejected(String), -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct Fill { - pub timestamp: DateTime, - pub price: f64, - pub quantity: f64, - pub commission: f64, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct OrderBookSnapshot { - pub symbol: String, - pub timestamp: DateTime, - pub bids: Vec, - pub asks: Vec, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct PriceLevel { - pub price: f64, - pub size: f64, - pub order_count: Option, -} - -impl TradingCore { - pub fn new( - mode: TradingMode, - market_data_source: Box, - execution_handler: Box, - time_provider: Box, - ) -> Self { - Self { - mode, - market_data_source: Arc::new(RwLock::new(market_data_source)), - execution_handler: Arc::new(RwLock::new(execution_handler)), - time_provider: Arc::new(time_provider), - orderbooks: Arc::new(orderbook::OrderBookManager::new()), - risk_engine: Arc::new(risk::RiskEngine::new()), - position_tracker: Arc::new(positions::PositionTracker::new()), - } - } - - pub fn get_mode(&self) -> &TradingMode { - &self.mode - } - - pub fn get_time(&self) -> DateTime { - self.time_provider.now() - } +#![deny(clippy::all)] + +// Existing modules +pub mod core; +pub mod adapters; +pub mod orderbook; +pub mod risk; +pub mod positions; +#[cfg(not(test))] +pub mod api; +pub mod analytics; +pub mod indicators; +pub mod backtest; +pub mod strategies; + +// Re-export commonly used types +pub use positions::{Position, PositionUpdate, TradeRecord, ClosedTrade}; +pub use risk::{RiskLimits, RiskCheckResult, RiskMetrics}; + +// Type alias for backtest compatibility +pub type MarketData = MarketUpdate; + +use chrono::{DateTime, Utc}; +use serde::{Deserialize, Serialize}; +use std::sync::Arc; +use parking_lot::RwLock; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub enum TradingMode { + Backtest { + start_time: DateTime, + end_time: DateTime, + speed_multiplier: f64, + }, + Paper { + starting_capital: f64, + }, + Live { + broker: String, + account_id: String, + }, +} + +// Core traits that allow different implementations based on mode +#[async_trait::async_trait] +pub trait MarketDataSource: Send + Sync { + async fn get_next_update(&mut self) -> Option; + fn seek_to_time(&mut self, timestamp: DateTime) -> Result<(), String>; + fn as_any(&self) -> &dyn std::any::Any; + fn as_any_mut(&mut self) -> &mut dyn std::any::Any; +} + +#[async_trait::async_trait] +pub trait ExecutionHandler: Send + Sync { + async fn execute_order(&mut self, order: Order) -> Result; + fn get_fill_simulator(&self) -> Option<&dyn FillSimulator>; +} + +pub trait TimeProvider: Send + Sync { + fn now(&self) -> DateTime; + fn sleep_until(&self, target: DateTime) -> Result<(), String>; + fn as_any(&self) -> &dyn std::any::Any; +} + +pub trait FillSimulator: Send + Sync { + fn simulate_fill(&self, order: &Order, orderbook: &OrderBookSnapshot) -> Option; +} + +// Main trading core that works across all modes +pub struct TradingCore { + mode: TradingMode, + pub market_data_source: Arc>>, + pub execution_handler: Arc>>, + pub time_provider: Arc>, + pub orderbooks: Arc, + pub risk_engine: Arc, + pub position_tracker: Arc, +} + +// Core types used across the system +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct MarketUpdate { + pub symbol: String, + pub timestamp: DateTime, + pub data: MarketDataType, +} + +// Market microstructure parameters +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct MarketMicrostructure { + pub symbol: String, + pub avg_spread_bps: f64, + pub daily_volume: f64, + pub avg_trade_size: f64, + pub volatility: f64, + pub tick_size: f64, + pub lot_size: f64, + pub intraday_volume_profile: Vec, // 24 hourly buckets +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub enum MarketDataType { + Quote(Quote), + Trade(Trade), + Bar(Bar), +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Quote { + pub bid: f64, + pub ask: f64, + pub bid_size: f64, + pub ask_size: f64, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Trade { + pub price: f64, + pub size: f64, + pub side: Side, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Bar { + pub open: f64, + pub high: f64, + pub low: f64, + pub close: f64, + pub volume: f64, + pub vwap: Option, +} + +#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq)] +pub enum Side { + Buy, + Sell, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Order { + pub id: String, + pub symbol: String, + pub side: Side, + pub quantity: f64, + pub order_type: OrderType, + pub time_in_force: TimeInForce, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub enum OrderType { + Market, + Limit { price: f64 }, + Stop { stop_price: f64 }, + StopLimit { stop_price: f64, limit_price: f64 }, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub enum TimeInForce { + Day, + GTC, + IOC, + FOK, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ExecutionResult { + pub order_id: String, + pub status: OrderStatus, + pub fills: Vec, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub enum OrderStatus { + Pending, + Accepted, + PartiallyFilled, + Filled, + Cancelled, + Rejected(String), +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Fill { + pub timestamp: DateTime, + pub price: f64, + pub quantity: f64, + pub commission: f64, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct OrderBookSnapshot { + pub symbol: String, + pub timestamp: DateTime, + pub bids: Vec, + pub asks: Vec, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct PriceLevel { + pub price: f64, + pub size: f64, + pub order_count: Option, +} + +impl TradingCore { + pub fn new( + mode: TradingMode, + market_data_source: Box, + execution_handler: Box, + time_provider: Box, + ) -> Self { + Self { + mode, + market_data_source: Arc::new(RwLock::new(market_data_source)), + execution_handler: Arc::new(RwLock::new(execution_handler)), + time_provider: Arc::new(time_provider), + orderbooks: Arc::new(orderbook::OrderBookManager::new()), + risk_engine: Arc::new(risk::RiskEngine::new()), + position_tracker: Arc::new(positions::PositionTracker::new()), + } + } + + pub fn get_mode(&self) -> &TradingMode { + &self.mode + } + + pub fn get_time(&self) -> DateTime { + self.time_provider.now() + } } \ No newline at end of file diff --git a/apps/stock/engine/src/lib_new.rs b/apps/stock/engine/src/lib_new.rs new file mode 100644 index 0000000..2d3d103 --- /dev/null +++ b/apps/stock/engine/src/lib_new.rs @@ -0,0 +1,67 @@ +#![deny(clippy::all)] + +// Domain modules +pub mod domain; +pub mod events; +pub mod modes; + +// Core functionality modules +pub mod core; +pub mod orderbook; +pub mod risk; +pub mod positions; +pub mod analytics; +pub mod indicators; +pub mod backtest; +pub mod strategies; + +// API layer +pub mod api; + +// Re-export commonly used types from domain +pub use domain::{ + // Market types + Quote, Bar, Trade, MarketUpdate, MarketDataType, + // Order types + Order, OrderType, OrderStatus, TimeInForce, Side, Fill, + // Position types + Position, PositionUpdate, + // Event types + Event, EventType, EventHandler, +}; + +// Re-export mode types +pub use modes::{TradingMode, TradingEngine}; + +// Re-export other commonly used types +pub use positions::{PositionTracker, TradeRecord, ClosedTrade}; +pub use risk::{RiskLimits, RiskCheckResult, RiskMetrics}; + +// Core traits that define the system's abstractions +use chrono::{DateTime, Utc}; +use std::sync::Arc; +use async_trait::async_trait; + +#[async_trait] +pub trait MarketDataSource: Send + Sync { + async fn get_next_update(&mut self) -> Option; + fn seek_to_time(&mut self, timestamp: DateTime) -> Result<(), String>; + fn as_any(&self) -> &dyn std::any::Any; + fn as_any_mut(&mut self) -> &mut dyn std::any::Any; +} + +#[async_trait] +pub trait ExecutionHandler: Send + Sync { + async fn submit_order(&self, order: &Order) -> Result; + async fn cancel_order(&self, order_id: &str) -> Result<(), String>; + async fn get_order_status(&self, order_id: &str) -> Result; +} + +pub trait TimeProvider: Send + Sync { + fn now(&self) -> DateTime; + fn as_any(&self) -> &dyn std::any::Any; +} + +pub trait FillSimulator: Send + Sync { + fn simulate_fill(&self, order: &Order, market_price: f64) -> Option; +} \ No newline at end of file diff --git a/apps/stock/engine/src/lib_simplified.rs b/apps/stock/engine/src/lib_simplified.rs new file mode 100644 index 0000000..3edf68e --- /dev/null +++ b/apps/stock/engine/src/lib_simplified.rs @@ -0,0 +1,123 @@ +#![deny(clippy::all)] + +// Domain modules - core types and abstractions +pub mod domain; +pub mod events; +pub mod modes; +pub mod strategies; + +// Core functionality modules +pub mod core; +pub mod orderbook; +pub mod risk; +pub mod positions; +pub mod analytics; +pub mod indicators; +pub mod backtest; + +// API layer +pub mod api; + +// Re-export all domain types +pub use domain::*; + +// Re-export event system +pub use events::{Event, EventType, EventBus, EventHandler}; + +// Re-export mode types and engine trait +pub use modes::{TradingMode, TradingEngine}; + +// Re-export strategy framework +pub use strategies::framework::{Strategy, StrategyContext, Signal, SignalAction}; + +// Re-export position tracking +pub use positions::{PositionTracker, TradeRecord, ClosedTrade}; + +// Re-export risk management +pub use risk::{RiskLimits, RiskCheckResult, RiskMetrics, RiskEngine}; + +// Re-export analytics +pub use analytics::{AnalyticsEngine, PerformanceMetrics}; + +// Re-export indicators +pub use indicators::{Indicator, IndicatorSet}; + +// Re-export backtest types +pub use backtest::{BacktestEngine, BacktestResults}; + +// Re-export API +pub use api::TradingAPI; + +// Core system traits +use async_trait::async_trait; +use chrono::{DateTime, Utc}; + +/// Source of market data - can be historical files, live feed, or simulated +#[async_trait] +pub trait MarketDataSource: Send + Sync { + async fn get_next_update(&mut self) -> Option; + fn seek_to_time(&mut self, timestamp: DateTime) -> Result<(), String>; +} + +/// Handles order execution - can be simulated, paper, or live broker +#[async_trait] +pub trait ExecutionHandler: Send + Sync { + async fn submit_order(&self, order: &Order) -> Result; + async fn cancel_order(&self, order_id: &str) -> Result<(), String>; + async fn get_order_status(&self, order_id: &str) -> Result; +} + +/// Provides current time - can be simulated time for backtest or real time +pub trait TimeProvider: Send + Sync { + fn now(&self) -> DateTime; + fn sleep_until(&self, target: DateTime) -> Result<(), String>; +} + +/// Simulates order fills for backtest/paper trading +pub trait FillSimulator: Send + Sync { + fn simulate_fill(&self, order: &Order, market_price: f64, spread: f64) -> Option; +} + +/// Main trading system that coordinates all components +pub struct TradingCore { + mode: TradingMode, + engine: Box, + event_bus: EventBus, + orderbook_manager: OrderBookManager, + position_tracker: PositionTracker, + risk_engine: RiskEngine, + analytics_engine: AnalyticsEngine, +} + +impl TradingCore { + /// Create a new trading system for the specified mode + pub fn new(mode: TradingMode) -> Result { + let engine = modes::create_engine_for_mode(&mode)?; + let event_bus = EventBus::new(); + + Ok(Self { + mode, + engine, + event_bus, + orderbook_manager: OrderBookManager::new(), + position_tracker: PositionTracker::new(), + risk_engine: RiskEngine::new(), + analytics_engine: AnalyticsEngine::new(), + }) + } + + /// Start the trading system + pub async fn start(&mut self) -> Result<(), String> { + self.engine.start(&mut self.event_bus).await + } + + /// Stop the trading system + pub async fn stop(&mut self) -> Result<(), String> { + self.engine.stop().await + } + + /// Get current trading mode + pub fn mode(&self) -> &TradingMode { + &self.mode + } +} \ No newline at end of file diff --git a/apps/stock/engine/src/modes.bak/backtest.rs b/apps/stock/engine/src/modes.bak/backtest.rs new file mode 100644 index 0000000..3b3e4a2 --- /dev/null +++ b/apps/stock/engine/src/modes.bak/backtest.rs @@ -0,0 +1,291 @@ +use async_trait::async_trait; +use chrono::{DateTime, Utc}; +use std::sync::Arc; +use parking_lot::RwLock; +use crate::{ + MarketDataSource, ExecutionHandler, TimeProvider, FillSimulator, + MarketUpdate, Order, OrderStatus, Fill, OrderBookSnapshot, +}; +use crate::events::EventBus; +use crate::domain::{Event, EventType}; +use super::TradingEngine; + +/// Backtest-specific trading engine +pub struct BacktestEngine { + start_time: DateTime, + end_time: DateTime, + current_time: DateTime, + speed_multiplier: f64, + market_data: Box, + execution: BacktestExecutor, + is_running: Arc>, +} + +impl BacktestEngine { + pub fn new( + start_time: DateTime, + end_time: DateTime, + speed_multiplier: f64, + market_data: Box, + ) -> Self { + Self { + start_time, + end_time, + current_time: start_time, + speed_multiplier, + market_data, + execution: BacktestExecutor::new(), + is_running: Arc::new(RwLock::new(false)), + } + } +} + +#[async_trait] +impl TradingEngine for BacktestEngine { + async fn start(&mut self, event_bus: &mut EventBus) -> Result<(), String> { + *self.is_running.write() = true; + self.current_time = self.start_time; + + // Seek market data to start time + self.market_data.seek_to_time(self.start_time)?; + + // Emit start event + event_bus.publish(Event { + event_type: EventType::SystemStart, + timestamp: self.current_time, + data: serde_json::json!({ + "mode": "backtest", + "start_time": self.start_time, + "end_time": self.end_time, + }), + }).await; + + // Main backtest loop + while *self.is_running.read() && self.current_time < self.end_time { + // Get next market update + if let Some(update) = self.market_data.get_next_update().await { + // Update current time + self.current_time = update.timestamp; + + // Publish market data event + event_bus.publish(Event { + event_type: EventType::MarketData(update.clone()), + timestamp: self.current_time, + data: serde_json::Value::Null, + }).await; + + // Process any pending orders + self.execution.process_orders(&update, event_bus).await?; + } else { + // No more data + break; + } + + // Simulate time passing (for UI updates, etc.) + if self.speed_multiplier > 0.0 { + tokio::time::sleep(std::time::Duration::from_millis( + (10.0 / self.speed_multiplier) as u64 + )).await; + } + } + + // Emit stop event + event_bus.publish(Event { + event_type: EventType::SystemStop, + timestamp: self.current_time, + data: serde_json::json!({ + "reason": "backtest_complete", + "end_time": self.current_time, + }), + }).await; + + Ok(()) + } + + async fn stop(&mut self) -> Result<(), String> { + *self.is_running.write() = false; + Ok(()) + } + + fn get_execution_handler(&self) -> Arc { + Arc::new(self.execution.clone()) + } + + fn get_time_provider(&self) -> Arc { + Arc::new(BacktestTimeProvider { + current_time: self.current_time, + }) + } +} + +/// Backtest order executor +#[derive(Clone)] +struct BacktestExecutor { + pending_orders: Arc>>, + order_history: Arc>>, + fill_simulator: BacktestFillSimulator, +} + +impl BacktestExecutor { + fn new() -> Self { + Self { + pending_orders: Arc::new(RwLock::new(Vec::new())), + order_history: Arc::new(RwLock::new(Vec::new())), + fill_simulator: BacktestFillSimulator::new(), + } + } + + async fn process_orders( + &self, + market_update: &MarketUpdate, + event_bus: &mut EventBus, + ) -> Result<(), String> { + let mut orders = self.pending_orders.write(); + let mut filled_indices = Vec::new(); + + for (idx, order) in orders.iter().enumerate() { + if order.symbol != market_update.symbol { + continue; + } + + // Try to fill the order + if let Some(fill) = self.fill_simulator.try_fill(order, market_update) { + // Emit fill event + event_bus.publish(Event { + event_type: EventType::OrderFill { + order_id: order.id.clone(), + fill: fill.clone(), + }, + timestamp: market_update.timestamp, + data: serde_json::Value::Null, + }).await; + + filled_indices.push(idx); + } + } + + // Remove filled orders + for idx in filled_indices.into_iter().rev() { + let order = orders.remove(idx); + self.order_history.write().push((order, OrderStatus::Filled)); + } + + Ok(()) + } +} + +#[async_trait] +impl ExecutionHandler for BacktestExecutor { + async fn submit_order(&self, order: &Order) -> Result { + let order_id = order.id.clone(); + self.pending_orders.write().push(order.clone()); + Ok(order_id) + } + + async fn cancel_order(&self, order_id: &str) -> Result<(), String> { + let mut orders = self.pending_orders.write(); + if let Some(pos) = orders.iter().position(|o| o.id == order_id) { + let order = orders.remove(pos); + self.order_history.write().push((order, OrderStatus::Cancelled)); + Ok(()) + } else { + Err("Order not found".to_string()) + } + } + + async fn get_order_status(&self, order_id: &str) -> Result { + // Check pending orders + if self.pending_orders.read().iter().any(|o| o.id == order_id) { + return Ok(OrderStatus::Pending); + } + + // Check history + if let Some((_, status)) = self.order_history.read() + .iter() + .find(|(o, _)| o.id == order_id) { + return Ok(status.clone()); + } + + Err("Order not found".to_string()) + } +} + +/// Backtest time provider +struct BacktestTimeProvider { + current_time: DateTime, +} + +impl TimeProvider for BacktestTimeProvider { + fn now(&self) -> DateTime { + self.current_time + } + + fn sleep_until(&self, _target: DateTime) -> Result<(), String> { + // In backtest, we don't actually sleep + Ok(()) + } +} + +/// Backtest fill simulator +#[derive(Clone)] +struct BacktestFillSimulator { + commission_rate: f64, + slippage_bps: f64, +} + +impl BacktestFillSimulator { + fn new() -> Self { + Self { + commission_rate: 0.001, // 0.1% + slippage_bps: 5.0, // 5 basis points + } + } + + fn try_fill(&self, order: &Order, market_update: &MarketUpdate) -> Option { + match &market_update.data { + crate::MarketDataType::Quote(quote) => { + self.simulate_fill(order, quote.bid, quote.ask - quote.bid) + } + crate::MarketDataType::Trade(trade) => { + self.simulate_fill(order, trade.price, 0.0001 * trade.price) // 1bp spread estimate + } + crate::MarketDataType::Bar(bar) => { + // Use close price with estimated spread + self.simulate_fill(order, bar.close, 0.0002 * bar.close) // 2bp spread estimate + } + } + } +} + +impl FillSimulator for BacktestFillSimulator { + fn simulate_fill(&self, order: &Order, market_price: f64, spread: f64) -> Option { + let fill_price = match order.order_type { + crate::OrderType::Market => { + // Fill at market with slippage + let slippage = market_price * self.slippage_bps / 10000.0; + match order.side { + crate::Side::Buy => market_price + spread/2.0 + slippage, + crate::Side::Sell => market_price - spread/2.0 - slippage, + } + } + crate::OrderType::Limit { price } => { + // Check if limit price is satisfied + match order.side { + crate::Side::Buy if price >= market_price + spread/2.0 => price, + crate::Side::Sell if price <= market_price - spread/2.0 => price, + _ => return None, // Limit not satisfied + } + } + _ => return None, // Other order types not implemented yet + }; + + let commission = fill_price * order.quantity * self.commission_rate; + + Some(Fill { + timestamp: chrono::Utc::now(), // Will be overridden by engine + price: fill_price, + quantity: order.quantity, + commission, + }) + } +} \ No newline at end of file diff --git a/apps/stock/engine/src/modes.bak/live.rs b/apps/stock/engine/src/modes.bak/live.rs new file mode 100644 index 0000000..3fcf6bd --- /dev/null +++ b/apps/stock/engine/src/modes.bak/live.rs @@ -0,0 +1,290 @@ +use async_trait::async_trait; +use chrono::{DateTime, Utc}; +use std::sync::Arc; +use parking_lot::RwLock; +use tokio::sync::mpsc; +use crate::{ + ExecutionHandler, TimeProvider, + Order, OrderStatus, Fill, +}; +use crate::events::EventBus; +use crate::domain::{Event, EventType}; +use super::TradingEngine; + +/// Live trading engine - connects to real brokers +pub struct LiveEngine { + broker: String, + account_id: String, + broker_connection: Arc, + is_running: Arc>, + shutdown_tx: Option>, +} + +/// Trait for broker connections +#[async_trait] +pub trait BrokerConnection: Send + Sync { + async fn connect(&mut self, account_id: &str) -> Result<(), String>; + async fn disconnect(&mut self) -> Result<(), String>; + async fn subscribe_market_data(&mut self, symbols: Vec) -> Result<(), String>; + async fn submit_order(&self, order: &Order) -> Result; + async fn cancel_order(&self, order_id: &str) -> Result<(), String>; + async fn get_order_status(&self, order_id: &str) -> Result; + async fn get_positions(&self) -> Result, String>; + async fn get_account_info(&self) -> Result; +} + +#[derive(Debug, Clone)] +pub struct AccountInfo { + pub cash: f64, + pub buying_power: f64, + pub portfolio_value: f64, + pub day_trades_remaining: Option, +} + +impl LiveEngine { + pub fn new( + broker: String, + account_id: String, + broker_connection: Arc, + ) -> Self { + Self { + broker, + account_id, + broker_connection, + is_running: Arc::new(RwLock::new(false)), + shutdown_tx: None, + } + } +} + +#[async_trait] +impl TradingEngine for LiveEngine { + async fn start(&mut self, event_bus: &mut EventBus) -> Result<(), String> { + *self.is_running.write() = true; + + // Connect to broker + self.broker_connection.connect(&self.account_id).await?; + + // Get initial account info + let account_info = self.broker_connection.get_account_info().await?; + + let (shutdown_tx, mut shutdown_rx) = mpsc::channel(1); + self.shutdown_tx = Some(shutdown_tx); + + // Emit start event + event_bus.publish(Event { + event_type: EventType::SystemStart, + timestamp: Utc::now(), + data: serde_json::json!({ + "mode": "live", + "broker": self.broker, + "account_id": self.account_id, + "account_info": { + "cash": account_info.cash, + "buying_power": account_info.buying_power, + "portfolio_value": account_info.portfolio_value, + }, + }), + }).await; + + // Main live trading loop + loop { + tokio::select! { + _ = shutdown_rx.recv() => { + break; + } + _ = tokio::time::sleep(std::time::Duration::from_secs(1)) => { + // Periodic tasks (e.g., check positions, risk) + if !*self.is_running.read() { + break; + } + + // Could emit periodic status updates here + } + } + } + + // Disconnect from broker + self.broker_connection.disconnect().await?; + + // Emit stop event + event_bus.publish(Event { + event_type: EventType::SystemStop, + timestamp: Utc::now(), + data: serde_json::json!({ + "reason": "live_trading_stopped", + }), + }).await; + + Ok(()) + } + + async fn stop(&mut self) -> Result<(), String> { + *self.is_running.write() = false; + if let Some(tx) = self.shutdown_tx.take() { + let _ = tx.send(()).await; + } + Ok(()) + } + + fn get_execution_handler(&self) -> Arc { + Arc::new(LiveExecutor { + broker_connection: self.broker_connection.clone(), + }) + } + + fn get_time_provider(&self) -> Arc { + Arc::new(RealTimeProvider) + } +} + +/// Live order executor - delegates to broker +#[derive(Clone)] +struct LiveExecutor { + broker_connection: Arc, +} + +#[async_trait] +impl ExecutionHandler for LiveExecutor { + async fn submit_order(&self, order: &Order) -> Result { + // Validate order + if order.quantity <= 0.0 { + return Err("Invalid order quantity".to_string()); + } + + // Submit to broker + self.broker_connection.submit_order(order).await + } + + async fn cancel_order(&self, order_id: &str) -> Result<(), String> { + self.broker_connection.cancel_order(order_id).await + } + + async fn get_order_status(&self, order_id: &str) -> Result { + self.broker_connection.get_order_status(order_id).await + } +} + +/// Real-time provider for live trading +struct RealTimeProvider; + +impl TimeProvider for RealTimeProvider { + fn now(&self) -> DateTime { + Utc::now() + } + + fn sleep_until(&self, target: DateTime) -> Result<(), String> { + let now = Utc::now(); + if target > now { + let duration = target.signed_duration_since(now); + std::thread::sleep(duration.to_std().unwrap_or_default()); + } + Ok(()) + } +} + +// Example broker implementations would go here +// For now, we'll create a mock broker for testing + +/// Mock broker for testing +pub struct MockBroker { + is_connected: bool, + orders: Arc>>, +} + +impl MockBroker { + pub fn new() -> Self { + Self { + is_connected: false, + orders: Arc::new(RwLock::new(Vec::new())), + } + } +} + +#[async_trait] +impl BrokerConnection for MockBroker { + async fn connect(&mut self, _account_id: &str) -> Result<(), String> { + self.is_connected = true; + Ok(()) + } + + async fn disconnect(&mut self) -> Result<(), String> { + self.is_connected = false; + Ok(()) + } + + async fn subscribe_market_data(&mut self, _symbols: Vec) -> Result<(), String> { + if !self.is_connected { + return Err("Not connected".to_string()); + } + Ok(()) + } + + async fn submit_order(&self, order: &Order) -> Result { + if !self.is_connected { + return Err("Not connected".to_string()); + } + + let order_id = order.id.clone(); + self.orders.write().push((order.clone(), OrderStatus::Pending)); + + // Simulate order being filled after a delay + let orders = self.orders.clone(); + let order_id_clone = order_id.clone(); + tokio::spawn(async move { + tokio::time::sleep(std::time::Duration::from_millis(100)).await; + let mut orders = orders.write(); + if let Some(pos) = orders.iter().position(|(o, _)| o.id == order_id_clone) { + orders[pos].1 = OrderStatus::Filled; + } + }); + + Ok(order_id) + } + + async fn cancel_order(&self, order_id: &str) -> Result<(), String> { + if !self.is_connected { + return Err("Not connected".to_string()); + } + + let mut orders = self.orders.write(); + if let Some(pos) = orders.iter().position(|(o, _)| o.id == order_id) { + orders[pos].1 = OrderStatus::Cancelled; + Ok(()) + } else { + Err("Order not found".to_string()) + } + } + + async fn get_order_status(&self, order_id: &str) -> Result { + if !self.is_connected { + return Err("Not connected".to_string()); + } + + let orders = self.orders.read(); + if let Some((_, status)) = orders.iter().find(|(o, _)| o.id == order_id) { + Ok(status.clone()) + } else { + Err("Order not found".to_string()) + } + } + + async fn get_positions(&self) -> Result, String> { + if !self.is_connected { + return Err("Not connected".to_string()); + } + Ok(Vec::new()) + } + + async fn get_account_info(&self) -> Result { + if !self.is_connected { + return Err("Not connected".to_string()); + } + Ok(AccountInfo { + cash: 100_000.0, + buying_power: 400_000.0, + portfolio_value: 100_000.0, + day_trades_remaining: Some(3), + }) + } +} \ No newline at end of file diff --git a/apps/stock/engine/src/modes.bak/mod.rs b/apps/stock/engine/src/modes.bak/mod.rs new file mode 100644 index 0000000..bb58299 --- /dev/null +++ b/apps/stock/engine/src/modes.bak/mod.rs @@ -0,0 +1,106 @@ +use async_trait::async_trait; +use crate::events::EventBus; +use crate::{ExecutionHandler, TimeProvider, MarketDataSource}; +use std::sync::Arc; + +pub mod backtest; +pub mod paper; +pub mod live; + +pub use backtest::BacktestEngine; +pub use paper::PaperEngine; +pub use live::{LiveEngine, BrokerConnection}; + +/// Trading mode configuration +#[derive(Debug, Clone)] +pub enum TradingMode { + Backtest { + start_time: chrono::DateTime, + end_time: chrono::DateTime, + speed_multiplier: f64, + }, + Paper { + starting_capital: f64, + }, + Live { + broker: String, + account_id: String, + }, +} + +/// Common interface for all trading engines +#[async_trait] +pub trait TradingEngine: Send + Sync { + /// Start the trading engine + async fn start(&mut self, event_bus: &mut EventBus) -> Result<(), String>; + + /// Stop the trading engine + async fn stop(&mut self) -> Result<(), String>; + + /// Get the execution handler for this mode + fn get_execution_handler(&self) -> Arc; + + /// Get the time provider for this mode + fn get_time_provider(&self) -> Arc; +} + +/// Create a trading engine for the specified mode +pub fn create_engine_for_mode( + mode: &TradingMode, +) -> Result, String> { + match mode { + TradingMode::Backtest { start_time, end_time, speed_multiplier } => { + // For backtest, we need to create a market data source + // This would typically load historical data + let market_data = create_backtest_data_source()?; + + Ok(Box::new(BacktestEngine::new( + *start_time, + *end_time, + *speed_multiplier, + market_data, + ))) + } + TradingMode::Paper { starting_capital } => { + // For paper trading, we need a real-time data source + let market_data = create_realtime_data_source()?; + + Ok(Box::new(PaperEngine::new( + *starting_capital, + market_data, + ))) + } + TradingMode::Live { broker, account_id } => { + // For live trading, we need a broker connection + let broker_connection = create_broker_connection(broker)?; + + Ok(Box::new(LiveEngine::new( + broker.clone(), + account_id.clone(), + broker_connection, + ))) + } + } +} + +// Helper functions to create data sources and broker connections +// These would be implemented based on your specific requirements + +fn create_backtest_data_source() -> Result, String> { + // TODO: Implement actual backtest data source + // For now, return a placeholder + Err("Backtest data source not implemented yet".to_string()) +} + +fn create_realtime_data_source() -> Result, String> { + // TODO: Implement actual real-time data source + // For now, return a placeholder + Err("Real-time data source not implemented yet".to_string()) +} + +fn create_broker_connection(broker: &str) -> Result, String> { + match broker { + "mock" => Ok(Arc::new(live::MockBroker::new())), + _ => Err(format!("Unknown broker: {}", broker)), + } +} \ No newline at end of file diff --git a/apps/stock/engine/src/modes.bak/paper.rs b/apps/stock/engine/src/modes.bak/paper.rs new file mode 100644 index 0000000..885474e --- /dev/null +++ b/apps/stock/engine/src/modes.bak/paper.rs @@ -0,0 +1,306 @@ +use async_trait::async_trait; +use chrono::{DateTime, Utc}; +use std::sync::Arc; +use parking_lot::RwLock; +use tokio::sync::mpsc; +use crate::{ + MarketDataSource, ExecutionHandler, TimeProvider, FillSimulator, + MarketUpdate, Order, OrderStatus, Fill, +}; +use crate::events::EventBus; +use crate::domain::{Event, EventType}; +use super::TradingEngine; + +/// Paper trading engine - simulates live trading without real money +pub struct PaperEngine { + starting_capital: f64, + market_data: Box, + execution: PaperExecutor, + is_running: Arc>, + shutdown_tx: Option>, +} + +impl PaperEngine { + pub fn new( + starting_capital: f64, + market_data: Box, + ) -> Self { + Self { + starting_capital, + market_data, + execution: PaperExecutor::new(starting_capital), + is_running: Arc::new(RwLock::new(false)), + shutdown_tx: None, + } + } +} + +#[async_trait] +impl TradingEngine for PaperEngine { + async fn start(&mut self, event_bus: &mut EventBus) -> Result<(), String> { + *self.is_running.write() = true; + + let (shutdown_tx, mut shutdown_rx) = mpsc::channel(1); + self.shutdown_tx = Some(shutdown_tx); + + // Emit start event + event_bus.publish(Event { + event_type: EventType::SystemStart, + timestamp: Utc::now(), + data: serde_json::json!({ + "mode": "paper", + "starting_capital": self.starting_capital, + }), + }).await; + + // Main paper trading loop + loop { + tokio::select! { + _ = shutdown_rx.recv() => { + break; + } + update = self.market_data.get_next_update() => { + if let Some(market_update) = update { + // Publish market data event + event_bus.publish(Event { + event_type: EventType::MarketData(market_update.clone()), + timestamp: Utc::now(), + data: serde_json::Value::Null, + }).await; + + // Process pending orders + self.execution.process_orders(&market_update, event_bus).await?; + } + } + _ = tokio::time::sleep(std::time::Duration::from_millis(100)) => { + // Check if still running + if !*self.is_running.read() { + break; + } + } + } + } + + // Emit stop event + event_bus.publish(Event { + event_type: EventType::SystemStop, + timestamp: Utc::now(), + data: serde_json::json!({ + "reason": "paper_trading_stopped", + }), + }).await; + + Ok(()) + } + + async fn stop(&mut self) -> Result<(), String> { + *self.is_running.write() = false; + if let Some(tx) = self.shutdown_tx.take() { + let _ = tx.send(()).await; + } + Ok(()) + } + + fn get_execution_handler(&self) -> Arc { + Arc::new(self.execution.clone()) + } + + fn get_time_provider(&self) -> Arc { + Arc::new(RealTimeProvider) + } +} + +/// Paper trading order executor +#[derive(Clone)] +struct PaperExecutor { + cash: Arc>, + pending_orders: Arc>>, + order_history: Arc>>, + fill_simulator: PaperFillSimulator, +} + +impl PaperExecutor { + fn new(starting_capital: f64) -> Self { + Self { + cash: Arc::new(RwLock::new(starting_capital)), + pending_orders: Arc::new(RwLock::new(Vec::new())), + order_history: Arc::new(RwLock::new(Vec::new())), + fill_simulator: PaperFillSimulator::new(), + } + } + + async fn process_orders( + &self, + market_update: &MarketUpdate, + event_bus: &mut EventBus, + ) -> Result<(), String> { + let mut orders = self.pending_orders.write(); + let mut filled_indices = Vec::new(); + + for (idx, order) in orders.iter().enumerate() { + if order.symbol != market_update.symbol { + continue; + } + + // Try to fill the order + if let Some(fill) = self.fill_simulator.try_fill(order, market_update) { + // Check if we have enough cash for buy orders + if order.side == crate::Side::Buy { + let required_cash = fill.price * fill.quantity + fill.commission; + let mut cash = self.cash.write(); + if *cash >= required_cash { + *cash -= required_cash; + } else { + continue; // Skip this order + } + } else { + // For sell orders, add cash + let proceeds = fill.price * fill.quantity - fill.commission; + *self.cash.write() += proceeds; + } + + // Emit fill event + event_bus.publish(Event { + event_type: EventType::OrderFill { + order_id: order.id.clone(), + fill: fill.clone(), + }, + timestamp: Utc::now(), + data: serde_json::json!({ + "cash_after": *self.cash.read(), + }), + }).await; + + filled_indices.push(idx); + } + } + + // Remove filled orders + for idx in filled_indices.into_iter().rev() { + let order = orders.remove(idx); + self.order_history.write().push((order, OrderStatus::Filled)); + } + + Ok(()) + } +} + +#[async_trait] +impl ExecutionHandler for PaperExecutor { + async fn submit_order(&self, order: &Order) -> Result { + // Basic validation + if order.quantity <= 0.0 { + return Err("Invalid order quantity".to_string()); + } + + let order_id = order.id.clone(); + self.pending_orders.write().push(order.clone()); + Ok(order_id) + } + + async fn cancel_order(&self, order_id: &str) -> Result<(), String> { + let mut orders = self.pending_orders.write(); + if let Some(pos) = orders.iter().position(|o| o.id == order_id) { + let order = orders.remove(pos); + self.order_history.write().push((order, OrderStatus::Cancelled)); + Ok(()) + } else { + Err("Order not found".to_string()) + } + } + + async fn get_order_status(&self, order_id: &str) -> Result { + // Check pending orders + if self.pending_orders.read().iter().any(|o| o.id == order_id) { + return Ok(OrderStatus::Pending); + } + + // Check history + if let Some((_, status)) = self.order_history.read() + .iter() + .find(|(o, _)| o.id == order_id) { + return Ok(status.clone()); + } + + Err("Order not found".to_string()) + } +} + +/// Real-time provider for paper trading +struct RealTimeProvider; + +impl TimeProvider for RealTimeProvider { + fn now(&self) -> DateTime { + Utc::now() + } + + fn sleep_until(&self, target: DateTime) -> Result<(), String> { + let now = Utc::now(); + if target > now { + let duration = target.signed_duration_since(now); + std::thread::sleep(duration.to_std().unwrap_or_default()); + } + Ok(()) + } +} + +/// Paper trading fill simulator +#[derive(Clone)] +struct PaperFillSimulator { + commission_rate: f64, + slippage_bps: f64, +} + +impl PaperFillSimulator { + fn new() -> Self { + Self { + commission_rate: 0.001, // 0.1% + slippage_bps: 3.0, // 3 basis points (less than backtest) + } + } + + fn try_fill(&self, order: &Order, market_update: &MarketUpdate) -> Option { + match &market_update.data { + crate::MarketDataType::Quote(quote) => { + self.simulate_fill(order, quote.bid, quote.ask - quote.bid) + } + crate::MarketDataType::Trade(trade) => { + self.simulate_fill(order, trade.price, 0.0001 * trade.price) + } + crate::MarketDataType::Bar(bar) => { + self.simulate_fill(order, bar.close, 0.0002 * bar.close) + } + } + } +} + +impl FillSimulator for PaperFillSimulator { + fn simulate_fill(&self, order: &Order, market_price: f64, spread: f64) -> Option { + let fill_price = match order.order_type { + crate::OrderType::Market => { + let slippage = market_price * self.slippage_bps / 10000.0; + match order.side { + crate::Side::Buy => market_price + spread/2.0 + slippage, + crate::Side::Sell => market_price - spread/2.0 - slippage, + } + } + crate::OrderType::Limit { price } => { + match order.side { + crate::Side::Buy if price >= market_price + spread/2.0 => price, + crate::Side::Sell if price <= market_price - spread/2.0 => price, + _ => return None, + } + } + _ => return None, + }; + + let commission = fill_price * order.quantity * self.commission_rate; + + Some(Fill { + timestamp: Utc::now(), + price: fill_price, + quantity: order.quantity, + commission, + }) + } +} \ No newline at end of file diff --git a/apps/stock/core/src/orderbook/analytics.rs b/apps/stock/engine/src/orderbook/analytics.rs similarity index 100% rename from apps/stock/core/src/orderbook/analytics.rs rename to apps/stock/engine/src/orderbook/analytics.rs diff --git a/apps/stock/core/src/orderbook/mod.rs b/apps/stock/engine/src/orderbook/mod.rs similarity index 100% rename from apps/stock/core/src/orderbook/mod.rs rename to apps/stock/engine/src/orderbook/mod.rs diff --git a/apps/stock/core/src/positions/mod.rs b/apps/stock/engine/src/positions/mod.rs similarity index 100% rename from apps/stock/core/src/positions/mod.rs rename to apps/stock/engine/src/positions/mod.rs diff --git a/apps/stock/core/src/risk/bet_sizing.rs b/apps/stock/engine/src/risk/bet_sizing.rs similarity index 100% rename from apps/stock/core/src/risk/bet_sizing.rs rename to apps/stock/engine/src/risk/bet_sizing.rs diff --git a/apps/stock/core/src/risk/mod.rs b/apps/stock/engine/src/risk/mod.rs similarity index 100% rename from apps/stock/core/src/risk/mod.rs rename to apps/stock/engine/src/risk/mod.rs diff --git a/apps/stock/core/src/risk/portfolio.rs b/apps/stock/engine/src/risk/portfolio.rs similarity index 100% rename from apps/stock/core/src/risk/portfolio.rs rename to apps/stock/engine/src/risk/portfolio.rs diff --git a/apps/stock/engine/src/strategies/framework/mod.rs b/apps/stock/engine/src/strategies/framework/mod.rs new file mode 100644 index 0000000..2173240 --- /dev/null +++ b/apps/stock/engine/src/strategies/framework/mod.rs @@ -0,0 +1,114 @@ +use async_trait::async_trait; +use serde_json::Value; +use crate::domain::{MarketUpdate, Fill, Order, Side}; +use crate::indicators::IndicatorSet; +use std::collections::HashMap; + +/// Context provided to strategies +pub struct StrategyContext { + pub portfolio_value: f64, + pub cash: f64, + pub positions: HashMap, + pub pending_orders: Vec, + pub indicators: IndicatorSet, +} + +/// Signal generated by a strategy +#[derive(Debug, Clone)] +pub struct Signal { + pub symbol: String, + pub action: SignalAction, + pub quantity: Option, + pub confidence: f64, // 0.0 to 1.0 + pub reason: String, + pub metadata: Option, +} + +#[derive(Debug, Clone)] +pub enum SignalAction { + Buy, + Sell, + Close, + Hold, +} + +/// Core strategy trait with lifecycle methods +#[async_trait] +pub trait Strategy: Send + Sync { + /// Called once when strategy is initialized + async fn init(&mut self, context: &StrategyContext) -> Result<(), String>; + + /// Called when trading starts + async fn on_start(&mut self) -> Result<(), String>; + + /// Called for each market data update + async fn on_data(&mut self, data: &MarketUpdate, context: &StrategyContext) -> Vec; + + /// Called when an order is filled + async fn on_fill(&mut self, order_id: &str, fill: &Fill, context: &StrategyContext); + + /// Called periodically (e.g., every minute) + async fn on_timer(&mut self, context: &StrategyContext) -> Vec { + Vec::new() // Default: no signals on timer + } + + /// Called when trading stops + async fn on_stop(&mut self) -> Result<(), String>; + + /// Get strategy name + fn name(&self) -> &str; + + /// Get strategy parameters + fn parameters(&self) -> Value; + + /// Update strategy parameters + fn update_parameters(&mut self, params: Value) -> Result<(), String>; +} + +/// Base implementation that strategies can extend +pub struct BaseStrategy { + name: String, + parameters: Value, +} + +impl BaseStrategy { + pub fn new(name: String, parameters: Value) -> Self { + Self { name, parameters } + } +} + +#[async_trait] +impl Strategy for BaseStrategy { + async fn init(&mut self, _context: &StrategyContext) -> Result<(), String> { + Ok(()) + } + + async fn on_start(&mut self) -> Result<(), String> { + Ok(()) + } + + async fn on_data(&mut self, _data: &MarketUpdate, _context: &StrategyContext) -> Vec { + Vec::new() + } + + async fn on_fill(&mut self, _order_id: &str, _fill: &Fill, _context: &StrategyContext) { + // Default: no action + } + + async fn on_stop(&mut self) -> Result<(), String> { + Ok(()) + } + + fn name(&self) -> &str { + &self.name + } + + fn parameters(&self) -> Value { + self.parameters.clone() + } + + fn update_parameters(&mut self, params: Value) -> Result<(), String> { + self.parameters = params; + Ok(()) + } +} \ No newline at end of file diff --git a/apps/stock/core/src/strategies/mean_reversion.rs b/apps/stock/engine/src/strategies/mean_reversion.rs similarity index 100% rename from apps/stock/core/src/strategies/mean_reversion.rs rename to apps/stock/engine/src/strategies/mean_reversion.rs diff --git a/apps/stock/core/src/strategies/mean_reversion_fixed.rs b/apps/stock/engine/src/strategies/mean_reversion_fixed.rs similarity index 100% rename from apps/stock/core/src/strategies/mean_reversion_fixed.rs rename to apps/stock/engine/src/strategies/mean_reversion_fixed.rs diff --git a/apps/stock/core/src/strategies/mod.rs b/apps/stock/engine/src/strategies/mod.rs similarity index 100% rename from apps/stock/core/src/strategies/mod.rs rename to apps/stock/engine/src/strategies/mod.rs diff --git a/apps/stock/core/src/strategies/momentum.rs b/apps/stock/engine/src/strategies/momentum.rs similarity index 100% rename from apps/stock/core/src/strategies/momentum.rs rename to apps/stock/engine/src/strategies/momentum.rs diff --git a/apps/stock/core/src/strategies/pairs_trading.rs b/apps/stock/engine/src/strategies/pairs_trading.rs similarity index 100% rename from apps/stock/core/src/strategies/pairs_trading.rs rename to apps/stock/engine/src/strategies/pairs_trading.rs diff --git a/apps/stock/engine/tests/basic_tests.rs b/apps/stock/engine/tests/basic_tests.rs new file mode 100644 index 0000000..1561e45 --- /dev/null +++ b/apps/stock/engine/tests/basic_tests.rs @@ -0,0 +1,143 @@ +use engine::{Order, OrderType, Side, TimeInForce, Quote, Bar, Trade, MarketDataType}; +use chrono::Utc; + +#[test] +fn test_order_creation() { + let order = Order { + id: "test-order-1".to_string(), + symbol: "AAPL".to_string(), + side: Side::Buy, + quantity: 100.0, + order_type: OrderType::Market, + time_in_force: TimeInForce::Day, + }; + + assert_eq!(order.id, "test-order-1"); + assert_eq!(order.symbol, "AAPL"); + assert_eq!(order.side, Side::Buy); + assert_eq!(order.quantity, 100.0); +} + +#[test] +fn test_order_types() { + let market = OrderType::Market; + let limit = OrderType::Limit { price: 150.0 }; + let stop = OrderType::Stop { stop_price: 145.0 }; + let stop_limit = OrderType::StopLimit { + stop_price: 145.0, + limit_price: 144.5, + }; + + match limit { + OrderType::Limit { price } => assert_eq!(price, 150.0), + _ => panic!("Expected limit order"), + } + + match stop { + OrderType::Stop { stop_price } => assert_eq!(stop_price, 145.0), + _ => panic!("Expected stop order"), + } + + match stop_limit { + OrderType::StopLimit { stop_price, limit_price } => { + assert_eq!(stop_price, 145.0); + assert_eq!(limit_price, 144.5); + } + _ => panic!("Expected stop limit order"), + } + + assert!(matches!(market, OrderType::Market)); +} + +#[test] +fn test_quote_creation() { + let quote = Quote { + bid: 149.95, + ask: 150.05, + bid_size: 1000.0, + ask_size: 800.0, + }; + + assert_eq!(quote.bid, 149.95); + assert_eq!(quote.ask, 150.05); + assert_eq!(quote.bid_size, 1000.0); + assert_eq!(quote.ask_size, 800.0); +} + +#[test] +fn test_bar_creation() { + let bar = Bar { + open: 150.0, + high: 152.0, + low: 149.0, + close: 151.0, + volume: 1_000_000.0, + vwap: Some(150.5), + }; + + assert_eq!(bar.open, 150.0); + assert_eq!(bar.high, 152.0); + assert_eq!(bar.low, 149.0); + assert_eq!(bar.close, 151.0); + assert_eq!(bar.volume, 1_000_000.0); + assert_eq!(bar.vwap, Some(150.5)); +} + +#[test] +fn test_trade_creation() { + let trade = Trade { + price: 150.0, + size: 500.0, + side: Side::Buy, + }; + + assert_eq!(trade.price, 150.0); + assert_eq!(trade.size, 500.0); + assert_eq!(trade.side, Side::Buy); +} + +#[test] +fn test_market_data_type() { + let quote = Quote { + bid: 149.95, + ask: 150.05, + bid_size: 100.0, + ask_size: 100.0, + }; + + let quote_data = MarketDataType::Quote(quote.clone()); + + match quote_data { + MarketDataType::Quote(q) => { + assert_eq!(q.bid, quote.bid); + assert_eq!(q.ask, quote.ask); + } + _ => panic!("Expected quote data"), + } + + let bar = Bar { + open: 150.0, + high: 152.0, + low: 149.0, + close: 151.0, + volume: 10000.0, + vwap: None, + }; + + let bar_data = MarketDataType::Bar(bar.clone()); + + match bar_data { + MarketDataType::Bar(b) => { + assert_eq!(b.open, bar.open); + assert_eq!(b.close, bar.close); + } + _ => panic!("Expected bar data"), + } +} + +#[test] +fn test_side_equality() { + assert_eq!(Side::Buy, Side::Buy); + assert_eq!(Side::Sell, Side::Sell); + assert_ne!(Side::Buy, Side::Sell); +} \ No newline at end of file diff --git a/apps/stock/engine/tests/integration_test.rs b/apps/stock/engine/tests/integration_test.rs new file mode 100644 index 0000000..18321ad --- /dev/null +++ b/apps/stock/engine/tests/integration_test.rs @@ -0,0 +1,52 @@ +// Simple integration test that verifies basic functionality + +use engine::{Order, OrderType, Side, TimeInForce, TradingMode}; +use chrono::Utc; + +#[test] +fn test_trading_mode_creation() { + let backtest_mode = TradingMode::Backtest { + start_time: Utc::now(), + end_time: Utc::now(), + speed_multiplier: 1.0, + }; + + match backtest_mode { + TradingMode::Backtest { speed_multiplier, .. } => { + assert_eq!(speed_multiplier, 1.0); + } + _ => panic!("Expected backtest mode"), + } + + let paper_mode = TradingMode::Paper { + starting_capital: 100_000.0, + }; + + match paper_mode { + TradingMode::Paper { starting_capital } => { + assert_eq!(starting_capital, 100_000.0); + } + _ => panic!("Expected paper mode"), + } +} + +#[test] +fn test_order_with_limit_price() { + let order = Order { + id: "limit-order-1".to_string(), + symbol: "AAPL".to_string(), + side: Side::Buy, + quantity: 100.0, + order_type: OrderType::Limit { price: 150.0 }, + time_in_force: TimeInForce::GTC, + }; + + assert_eq!(order.symbol, "AAPL"); + assert_eq!(order.side, Side::Buy); + assert_eq!(order.quantity, 100.0); + + match order.order_type { + OrderType::Limit { price } => assert_eq!(price, 150.0), + _ => panic!("Expected limit order"), + } +} \ No newline at end of file diff --git a/apps/stock/engine/tests/lib.rs b/apps/stock/engine/tests/lib.rs new file mode 100644 index 0000000..641cd85 --- /dev/null +++ b/apps/stock/engine/tests/lib.rs @@ -0,0 +1,7 @@ +// Main test file for the engine crate + +#[cfg(test)] +mod basic_tests; + +#[cfg(test)] +mod integration_test; \ No newline at end of file diff --git a/apps/stock/orchestrator/debug-performance-values.ts b/apps/stock/orchestrator/debug-performance-values.ts deleted file mode 100644 index a184559..0000000 --- a/apps/stock/orchestrator/debug-performance-values.ts +++ /dev/null @@ -1,149 +0,0 @@ -import { BacktestEngine } from './src/backtest/BacktestEngine'; -import { StrategyManager } from './src/strategies/StrategyManager'; -import { StorageService } from './src/services/StorageService'; -import { ModeManager } from './src/core/ModeManager'; -import { MarketDataService } from './src/services/MarketDataService'; -import { ExecutionService } from './src/services/ExecutionService'; -import { IServiceContainer } from '@stock-bot/di'; - -async function debugPerformanceValues() { - console.log('Debugging Performance Calculation Values...\n'); - - // Create minimal service container with more logging - const container: IServiceContainer = { - logger: { - info: (msg: string, ...args: any[]) => { - // Log everything related to P&L and portfolio - if (msg.includes('P&L') || msg.includes('portfolio') || msg.includes('Portfolio') || - msg.includes('equity') || msg.includes('Total') || msg.includes('pnl')) { - console.log('[INFO]', msg, ...args); - } - }, - error: (msg: string, ...args: any[]) => console.error('[ERROR]', msg, ...args), - warn: (msg: string, ...args: any[]) => console.warn('[WARN]', msg, ...args), - debug: (msg: string, ...args: any[]) => { - if (msg.includes('P&L') || msg.includes('portfolio') || msg.includes('pnl')) { - console.log('[DEBUG]', msg, ...args); - } - }, - } as any, - custom: {} - }; - - // Initialize services - const storageService = new StorageService(); - const marketDataService = new MarketDataService(container); - const executionService = new ExecutionService(container); - const modeManager = new ModeManager(container, marketDataService, executionService, storageService); - const strategyManager = new StrategyManager(container); - - // Set services in container - container.custom = { - MarketDataService: marketDataService, - ExecutionService: executionService, - ModeManager: modeManager, - StorageService: storageService - }; - - // Initialize backtest mode - await modeManager.initializeMode({ - mode: 'backtest', - startDate: '2023-01-01T00:00:00Z', - endDate: '2023-01-15T00:00:00Z', // Just 15 days - speed: 'max', - symbols: ['TEST'], - initialCapital: 100000, - dataFrequency: '1d', - strategy: 'sma-crossover' - }); - - // Create backtest engine - const backtestEngine = new BacktestEngine(container, storageService, strategyManager); - - // Run backtest - const config = { - mode: 'backtest', - name: 'Debug Performance Values', - strategy: 'sma-crossover', - symbols: ['TEST'], - startDate: '2023-01-01T00:00:00Z', - endDate: '2023-01-15T00:00:00Z', - initialCapital: 100000, - commission: 0.001, - slippage: 0.0001, - dataFrequency: '1d', - speed: 'max' - }; - - console.log('Running backtest...'); - const result = await backtestEngine.runBacktest(config); - - // Debug values - console.log('\n=== RAW VALUES DEBUG ==='); - console.log(`Initial Capital: $${config.initialCapital}`); - console.log(`Reported Metrics:`); - console.log(` - Total Return: ${result.metrics.totalReturn}%`); - console.log(` - Sharpe Ratio: ${result.metrics.sharpeRatio}`); - console.log(` - Max Drawdown: ${result.metrics.maxDrawdown}%`); - console.log(` - Win Rate: ${result.metrics.winRate}%`); - console.log(` - Total Trades: ${result.metrics.totalTrades}`); - - console.log('\n=== EQUITY CURVE VALUES ==='); - console.log(`Equity Points: ${result.equity.length}`); - if (result.equity.length > 0) { - const first = result.equity[0]; - const last = result.equity[result.equity.length - 1]; - console.log(`First: ${first.date} => $${first.value}`); - console.log(`Last: ${last.date} => $${last.value}`); - - // Manual calculation - const manualReturn = ((last.value - first.value) / first.value) * 100; - console.log(`\nManual Total Return: ${manualReturn.toFixed(2)}%`); - console.log(`Difference from reported: ${Math.abs(manualReturn - result.metrics.totalReturn).toFixed(2)}%`); - } - - console.log('\n=== TRADE ANALYSIS ==='); - console.log(`Closed Trades: ${result.trades.length}`); - if (result.trades.length > 0) { - const wins = result.trades.filter(t => t.pnl > 0); - const losses = result.trades.filter(t => t.pnl < 0); - const manualWinRate = (wins.length / result.trades.length) * 100; - - console.log(`Wins: ${wins.length}`); - console.log(`Losses: ${losses.length}`); - console.log(`Manual Win Rate: ${manualWinRate.toFixed(2)}%`); - - // Show P&L values - const totalPnL = result.trades.reduce((sum, t) => sum + t.pnl, 0); - console.log(`\nTotal P&L from trades: $${totalPnL.toFixed(2)}`); - - // Show first few trades - console.log('\nFirst 3 trades:'); - result.trades.slice(0, 3).forEach((t, i) => { - console.log(` ${i+1}. ${t.side} ${t.quantity} @ ${t.exitPrice} | P&L: $${t.pnl.toFixed(2)}`); - }); - } - - // Check trading engine P&L - const tradingEngine = strategyManager.getTradingEngine(); - if (tradingEngine) { - try { - const [realized, unrealized] = tradingEngine.getTotalPnl(); - console.log('\n=== TRADING ENGINE P&L ==='); - console.log(`Realized P&L: $${realized.toFixed(2)}`); - console.log(`Unrealized P&L: $${unrealized.toFixed(2)}`); - console.log(`Total P&L: $${(realized + unrealized).toFixed(2)}`); - console.log(`Portfolio Value: $${(config.initialCapital + realized + unrealized).toFixed(2)}`); - } catch (e) { - console.error('Failed to get P&L from trading engine:', e); - } - } - - console.log('\n=== TEST COMPLETE ==='); - process.exit(0); -} - -debugPerformanceValues().catch(error => { - console.error('Test failed:', error); - process.exit(1); -}); \ No newline at end of file diff --git a/apps/stock/orchestrator/docs/technical-indicators.md b/apps/stock/orchestrator/docs/technical-indicators.md index 75ddfc4..5ab6cb8 100644 --- a/apps/stock/orchestrator/docs/technical-indicators.md +++ b/apps/stock/orchestrator/docs/technical-indicators.md @@ -6,7 +6,7 @@ The stock-bot orchestrator includes a high-performance Technical Analysis (TA) l The TA library consists of: 1. **Rust Core**: High-performance indicator calculations in `apps/stock/core/src/indicators/` -2. **NAPI Bindings**: TypeScript interfaces exposed through `@stock-bot/core` +2. **NAPI Bindings**: TypeScript interfaces exposed through `@stock-bot/engine` 3. **TypeScript Wrapper**: Convenient API in `orchestrator/src/indicators/TechnicalAnalysis.ts` ## Available Indicators diff --git a/apps/stock/orchestrator/examples/advanced-risk-management.ts b/apps/stock/orchestrator/examples/advanced-risk-management.ts index 2427631..0f7d8c8 100644 --- a/apps/stock/orchestrator/examples/advanced-risk-management.ts +++ b/apps/stock/orchestrator/examples/advanced-risk-management.ts @@ -3,7 +3,7 @@ * Demonstrates orderbook analytics, portfolio risk, and bet sizing */ -import { TradingEngine, RiskAnalyzer, OrderbookAnalyzer } from '@stock-bot/core'; +import { OrderbookAnalyzer, RiskAnalyzer, TradingEngine } from '@stock-bot/engine'; import { getLogger } from '@stock-bot/logger'; const logger = getLogger('AdvancedRiskExample'); diff --git a/apps/stock/orchestrator/examples/debug-rust-short-trades.ts b/apps/stock/orchestrator/examples/debug-rust-short-trades.ts index 19f3cf4..3bc3b85 100644 --- a/apps/stock/orchestrator/examples/debug-rust-short-trades.ts +++ b/apps/stock/orchestrator/examples/debug-rust-short-trades.ts @@ -1,4 +1,4 @@ -import { TradingEngine } from '@stock-bot/core'; +import { TradingEngine } from '@stock-bot/engine'; async function debugRustShortTrades() { // Create engine config for backtest mode diff --git a/apps/stock/orchestrator/examples/indicator-usage.ts b/apps/stock/orchestrator/examples/indicator-usage.ts index bf52711..f8a5055 100644 --- a/apps/stock/orchestrator/examples/indicator-usage.ts +++ b/apps/stock/orchestrator/examples/indicator-usage.ts @@ -2,8 +2,7 @@ * Examples of using the Rust-based Technical Analysis library */ -import { TechnicalIndicators, IncrementalSMA, IncrementalEMA, IncrementalRSI } from '@stock-bot/core'; -import { TechnicalAnalysis, IncrementalIndicators, SignalGenerator } from '../src/indicators/TechnicalAnalysis'; +import { IncrementalIndicators, SignalGenerator, TechnicalAnalysis } from '../src/indicators/TechnicalAnalysis'; // Example 1: Basic indicator calculations async function basicIndicatorExample() { diff --git a/apps/stock/orchestrator/src/backtest/RustBacktestAdapter.ts b/apps/stock/orchestrator/src/backtest/RustBacktestAdapter.ts index e1ce51f..b88ae34 100644 --- a/apps/stock/orchestrator/src/backtest/RustBacktestAdapter.ts +++ b/apps/stock/orchestrator/src/backtest/RustBacktestAdapter.ts @@ -1,9 +1,9 @@ -import { EventEmitter } from 'events'; import { IServiceContainer } from '@stock-bot/di'; -import { BacktestEngine as RustEngine } from '@stock-bot/core'; -import { BacktestConfig, BacktestResult } from '../types'; +import { BacktestEngine as RustEngine } from '@stock-bot/engine'; +import { EventEmitter } from 'events'; import { StorageService } from '../services/StorageService'; -import { StrategyExecutor, SMACrossoverStrategy } from '../strategies/StrategyExecutor'; +import { SMACrossoverStrategy, StrategyExecutor } from '../strategies/StrategyExecutor'; +import { BacktestConfig, BacktestResult } from '../types'; /** * Adapter that bridges the orchestrator with the Rust backtest engine @@ -208,7 +208,7 @@ export class RustBacktestAdapter extends EventEmitter { } private registerStrategy(strategyName: string, parameters: any): void { - if (!this.currentEngine) return; + if (!this.currentEngine) {return;} this.container.logger.info('Registering strategy', { strategyName, diff --git a/apps/stock/orchestrator/src/backtest/RustBacktestEngine.ts b/apps/stock/orchestrator/src/backtest/RustBacktestEngine.ts index 8681969..6e5ad7c 100644 --- a/apps/stock/orchestrator/src/backtest/RustBacktestEngine.ts +++ b/apps/stock/orchestrator/src/backtest/RustBacktestEngine.ts @@ -1,8 +1,8 @@ -import { BacktestEngine as RustEngine } from '@stock-bot/core'; -import { RustStrategy } from '../strategies/RustStrategy'; -import { MarketData, BacktestConfig } from '../types'; -import { StorageService } from '../services/StorageService'; import { IServiceContainer } from '@stock-bot/di'; +import { BacktestEngine as RustEngine } from '@stock-bot/engine'; +import { StorageService } from '../services/StorageService'; +import { RustStrategy } from '../strategies/RustStrategy'; +import { BacktestConfig } from '../types'; export interface RustBacktestConfig { name: string; diff --git a/apps/stock/orchestrator/src/core/ModeManager.ts b/apps/stock/orchestrator/src/core/ModeManager.ts index 8102bed..4152b3b 100644 --- a/apps/stock/orchestrator/src/core/ModeManager.ts +++ b/apps/stock/orchestrator/src/core/ModeManager.ts @@ -1,10 +1,10 @@ -import { TradingEngine } from '@stock-bot/core'; import { IServiceContainer } from '@stock-bot/di'; -import { TradingMode, ModeConfig, BacktestConfigSchema, PaperConfigSchema, LiveConfigSchema } from '../types'; -import { MarketDataService } from '../services/MarketDataService'; -import { ExecutionService } from '../services/ExecutionService'; -import { StorageService } from '../services/StorageService'; +import { TradingEngine } from '@stock-bot/engine'; import { EventEmitter } from 'events'; +import { ExecutionService } from '../services/ExecutionService'; +import { MarketDataService } from '../services/MarketDataService'; +import { StorageService } from '../services/StorageService'; +import { BacktestConfigSchema, LiveConfigSchema, ModeConfig, PaperConfigSchema, TradingMode } from '../types'; export class ModeManager extends EventEmitter { private mode: TradingMode = 'paper'; @@ -148,7 +148,7 @@ export class ModeManager extends EventEmitter { } async shutdown(): Promise { - if (!this.isInitialized) return; + if (!this.isInitialized) {return;} this.container.logger.info(`Shutting down ${this.mode} mode...`); diff --git a/apps/stock/orchestrator/src/indicators/TechnicalAnalysis.ts b/apps/stock/orchestrator/src/indicators/TechnicalAnalysis.ts index ce5e32b..c98d3aa 100644 --- a/apps/stock/orchestrator/src/indicators/TechnicalAnalysis.ts +++ b/apps/stock/orchestrator/src/indicators/TechnicalAnalysis.ts @@ -1,4 +1,4 @@ -import { TechnicalIndicators, IncrementalSMA, IncrementalEMA, IncrementalRSI, MacdResult, BollingerBandsResult, StochasticResult } from '@stock-bot/core'; +import { BollingerBandsResult, IncrementalEMA, IncrementalRSI, IncrementalSMA, MacdResult, StochasticResult, TechnicalIndicators } from '@stock-bot/engine'; /** * Wrapper class for the Rust TA library with TypeScript-friendly interfaces @@ -57,7 +57,7 @@ export class TechnicalAnalysis { // Helper to check for crossovers static crossover(series1: number[], series2: number[]): boolean { - if (series1.length < 2 || series2.length < 2) return false; + if (series1.length < 2 || series2.length < 2) {return false;} const prev1 = series1[series1.length - 2]; const curr1 = series1[series1.length - 1]; const prev2 = series2[series2.length - 2]; @@ -66,7 +66,7 @@ export class TechnicalAnalysis { } static crossunder(series1: number[], series2: number[]): boolean { - if (series1.length < 2 || series2.length < 2) return false; + if (series1.length < 2 || series2.length < 2) {return false;} const prev1 = series1[series1.length - 2]; const curr1 = series1[series1.length - 1]; const prev2 = series2[series2.length - 2]; diff --git a/apps/stock/orchestrator/src/services/ExecutionService.ts b/apps/stock/orchestrator/src/services/ExecutionService.ts index 1e09268..16a2389 100644 --- a/apps/stock/orchestrator/src/services/ExecutionService.ts +++ b/apps/stock/orchestrator/src/services/ExecutionService.ts @@ -1,9 +1,8 @@ +import { IServiceContainer } from '@stock-bot/di'; +import { TradingEngine } from '@stock-bot/engine'; import { EventEmitter } from 'events'; import { v4 as uuidv4 } from 'uuid'; -import { IServiceContainer } from '@stock-bot/di'; import { ModeConfig, OrderRequest, OrderRequestSchema } from '../types'; -import { TradingEngine } from '@stock-bot/core'; -import axios from 'axios'; import { StorageService } from './StorageService'; interface ExecutionReport { @@ -233,7 +232,7 @@ export class ExecutionService extends EventEmitter { } private async processFills(executionReport: ExecutionReport): Promise { - if (!this.tradingEngine) return; + if (!this.tradingEngine) {return;} for (const fill of executionReport.fills) { // Update position in engine diff --git a/apps/stock/orchestrator/src/strategies/RustStrategy.ts b/apps/stock/orchestrator/src/strategies/RustStrategy.ts index 06b3881..225357e 100644 --- a/apps/stock/orchestrator/src/strategies/RustStrategy.ts +++ b/apps/stock/orchestrator/src/strategies/RustStrategy.ts @@ -1,4 +1,4 @@ -import { BacktestEngine } from '@stock-bot/core'; +import { BacktestEngine } from '@stock-bot/engine'; import { MarketData } from '../types'; export interface Signal { diff --git a/apps/stock/orchestrator/src/strategies/StrategyManager.ts b/apps/stock/orchestrator/src/strategies/StrategyManager.ts index 745ae61..6d73387 100644 --- a/apps/stock/orchestrator/src/strategies/StrategyManager.ts +++ b/apps/stock/orchestrator/src/strategies/StrategyManager.ts @@ -1,8 +1,8 @@ -import { EventEmitter } from 'events'; import { IServiceContainer } from '@stock-bot/di'; -import { MarketData, StrategyConfig, OrderRequest } from '../types'; +import { TradingEngine } from '@stock-bot/engine'; +import { EventEmitter } from 'events'; +import { MarketData, OrderRequest, StrategyConfig } from '../types'; import { BaseStrategy } from './BaseStrategy'; -import { TradingEngine } from '@stock-bot/core'; export class StrategyManager extends EventEmitter { private strategies = new Map(); diff --git a/apps/stock/orchestrator/test-api-response.ts b/apps/stock/orchestrator/test-api-response.ts deleted file mode 100644 index 485dd1e..0000000 --- a/apps/stock/orchestrator/test-api-response.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { createContainer } from './src/simple-container'; -import fetch from 'node-fetch'; - -async function testApiResponse() { - console.log('Testing API Response Values...\n'); - - // First, create the container and start the server - const container = await createContainer({ - database: { - mongodb: { enabled: false, uri: '' }, - postgres: { enabled: false, uri: '' }, - questdb: { enabled: false, host: '', port: 0 }, - dragonfly: { enabled: false } - } - }); - - // Run a simple backtest via API - const backtestRequest = { - strategy: 'sma-crossover', - symbols: ['AAPL'], - startDate: '2023-01-01', - endDate: '2023-02-01', - initialCapital: 100000, - config: { - commission: 0.001, - slippage: 0.0001, - dataFrequency: '1d' - } - }; - - try { - console.log('Sending backtest request...'); - const response = await fetch('http://localhost:2003/api/backtest/run', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify(backtestRequest) - }); - - if (!response.ok) { - throw new Error(`HTTP error! status: ${response.status}`); - } - - const result = await response.json(); - console.log('\n=== API RESPONSE ==='); - console.log(JSON.stringify(result, null, 2)); - - if (result.metrics) { - console.log('\n=== METRICS VALUES ==='); - console.log(`Total Return: ${result.metrics.totalReturn}`); - console.log(`Sharpe Ratio: ${result.metrics.sharpeRatio}`); - console.log(`Max Drawdown: ${result.metrics.maxDrawdown}`); - console.log(`Win Rate: ${result.metrics.winRate}`); - console.log(`Total Trades: ${result.metrics.totalTrades}`); - } - - } catch (error) { - console.error('API call failed:', error); - } - - console.log('\n=== TEST COMPLETE ==='); - process.exit(0); -} - -testApiResponse().catch(error => { - console.error('Test failed:', error); - process.exit(1); -}); \ No newline at end of file diff --git a/apps/stock/orchestrator/test-backtest-simple.ts b/apps/stock/orchestrator/test-backtest-simple.ts deleted file mode 100644 index fb9dfd8..0000000 --- a/apps/stock/orchestrator/test-backtest-simple.ts +++ /dev/null @@ -1,70 +0,0 @@ -#!/usr/bin/env bun - -/** - * Simple backtest test without full container - */ - -import { BacktestEngine } from './src/backtest/BacktestEngine'; -import { StrategyManager } from './src/strategies/StrategyManager'; -import { StorageService } from './src/services/StorageService'; -import { getLogger } from '@stock-bot/logger'; - -async function runSimpleBacktest() { - console.log('Running simple backtest test...\n'); - - // Create minimal container - const logger = getLogger('test'); - const container = { - logger, - custom: {} - }; - - // Create services - const storageService = new StorageService(container as any); - const strategyManager = new StrategyManager(container as any); - - // Initialize strategy - await strategyManager.initializeStrategies([{ - id: 'test-sma', - name: 'sma-crossover', - enabled: true, - symbols: ['AAPL'], - allocation: 1.0 - }]); - - // Create backtest engine - const backtestEngine = new BacktestEngine(container as any, storageService, strategyManager); - - const config = { - mode: 'backtest', - name: 'Simple SMA Test', - strategy: 'sma-crossover', - symbols: ['AAPL'], - startDate: '2023-01-01T00:00:00Z', - endDate: '2023-03-01T00:00:00Z', // Just 2 months - initialCapital: 100000, - dataFrequency: '1d', - commission: 0.001, - slippage: 0.0001 - }; - - try { - const result = await backtestEngine.runBacktest(config); - - console.log('\nBacktest Results:'); - console.log(`Total Return: ${result.metrics.totalReturn.toFixed(2)}%`); - console.log(`Total Trades: ${result.metrics.totalTrades}`); - console.log(`Trades in history: ${result.trades.length}`); - console.log(`Win Rate: ${result.metrics.winRate.toFixed(2)}%`); - - console.log('\nTrade Details:'); - result.trades.forEach((trade, i) => { - console.log(`Trade ${i + 1}: ${trade.side} ${trade.quantity} @ $${trade.entryPrice.toFixed(2)} -> $${trade.exitPrice.toFixed(2)} (P&L: $${trade.pnl.toFixed(2)})`); - }); - - } catch (error) { - console.error('Backtest failed:', error); - } -} - -runSimpleBacktest().catch(console.error); \ No newline at end of file diff --git a/apps/stock/orchestrator/test-backtest.ts b/apps/stock/orchestrator/test-backtest.ts deleted file mode 100644 index 20540d1..0000000 --- a/apps/stock/orchestrator/test-backtest.ts +++ /dev/null @@ -1,99 +0,0 @@ -#!/usr/bin/env bun - -import { createContainer } from './src/simple-container'; -import { BacktestEngine } from './src/backtest/BacktestEngine'; -import { StrategyManager } from './src/strategies/StrategyManager'; -import { SimpleMovingAverageCrossover } from './src/strategies/examples/SimpleMovingAverageCrossover'; - -async function runBacktest() { - console.log('Starting backtest test...'); - - // Create container with minimal config - const config = { - port: 2004, - mode: 'paper', - enableWebSocket: false, - database: { - mongodb: { enabled: false }, - postgres: { enabled: false }, - questdb: { enabled: false } - }, - redis: { - url: 'redis://localhost:6379' - }, - backtesting: { - maxConcurrent: 1, - defaultSpeed: 'max', - dataResolutions: ['1d'] - }, - strategies: { - maxActive: 10, - defaultTimeout: 30000 - } - }; - const container = await createContainer(config); - - // Initialize strategy manager - const strategyManager = new StrategyManager(container.executionService, container.modeManager); - - // Create and add strategy - const strategyConfig = { - id: 'sma-test', - name: 'SMA Test', - type: 'sma-crossover', - symbols: ['AA'], - active: true, - allocation: 1.0, - riskLimit: 0.02, - maxPositions: 10 - }; - - const strategy = new SimpleMovingAverageCrossover(strategyConfig, container.modeManager, container.executionService); - await strategyManager.addStrategy(strategy); - - // Create backtest engine - const backtestEngine = new BacktestEngine(container, strategyManager); - - // Run backtest - const backtestConfig = { - symbols: ['AA'], - strategy: 'sma-crossover', - startDate: '2024-01-01', - endDate: '2024-12-31', - initialCapital: 100000, - commission: 0.001, - slippage: 0.0005, - dataFrequency: '1d' - }; - - try { - console.log('Running backtest...'); - const result = await backtestEngine.runBacktest(backtestConfig); - - console.log('\n=== Backtest Results ==='); - console.log(`Total trades: ${result.metrics.totalTrades}`); - console.log(`Win rate: ${result.metrics.winRate.toFixed(2)}%`); - console.log(`Total return: ${result.metrics.totalReturn.toFixed(2)}%`); - console.log(`Sharpe ratio: ${result.metrics.sharpeRatio.toFixed(2)}`); - console.log(`Max drawdown: ${result.metrics.maxDrawdown.toFixed(2)}%`); - - console.log('\n=== Trade History ==='); - result.trades.forEach((trade, i) => { - console.log(`Trade ${i + 1}: ${trade.side} ${trade.quantity} ${trade.symbol} @ ${trade.entryPrice.toFixed(2)}`); - if (trade.exitDate) { - console.log(` Exit: ${trade.exitPrice.toFixed(2)}, P&L: ${trade.pnl.toFixed(2)} (${trade.pnlPercent.toFixed(2)}%)`); - } - }); - - console.log(`\nTotal trades in result: ${result.trades.length}`); - - } catch (error) { - console.error('Backtest failed:', error); - } finally { - // Cleanup - await container.shutdownManager.shutdown(); - process.exit(0); - } -} - -runBacktest().catch(console.error); \ No newline at end of file diff --git a/apps/stock/orchestrator/test-clear-crossovers.ts b/apps/stock/orchestrator/test-clear-crossovers.ts deleted file mode 100755 index 8b745d4..0000000 --- a/apps/stock/orchestrator/test-clear-crossovers.ts +++ /dev/null @@ -1,138 +0,0 @@ -#!/usr/bin/env bun - -/** - * Test with very clear crossover patterns - */ - -import { BacktestEngine } from './src/backtest/BacktestEngine'; -import { StrategyManager } from './src/strategies/StrategyManager'; -import { StorageService } from './src/services/StorageService'; -import { getLogger } from '@stock-bot/logger'; -import { ModeManager } from './src/core/ModeManager'; -import { MarketDataService } from './src/services/MarketDataService'; -import { ExecutionService } from './src/services/ExecutionService'; -import { DataManager } from './src/data/DataManager'; - -async function testClearCrossovers() { - console.log('=== Test with Clear Crossovers ===\n'); - - const logger = getLogger('test'); - const container = { - logger, - custom: {} - }; - - const storageService = new StorageService(container as any); - const marketDataService = new MarketDataService(container as any); - const executionService = new ExecutionService(container as any); - const modeManager = new ModeManager(container as any, marketDataService, executionService, storageService); - - container.custom = { - ModeManager: modeManager, - MarketDataService: marketDataService, - ExecutionService: executionService - }; - - const strategyManager = new StrategyManager(container as any); - const backtestEngine = new BacktestEngine(container as any, storageService, strategyManager); - - // Override data loading to provide clear patterns - const dataManager = new DataManager(container as any, storageService); - (backtestEngine as any).dataManager = dataManager; - - (dataManager as any).loadHistoricalData = async (symbols: string[], startDate: Date, endDate: Date) => { - const data = new Map(); - const bars = []; - - console.log('Generating clear crossover patterns...'); - - // Generate 100 days of data with 3 clear crossovers - // Pattern: Start high, go low (death cross), go high (golden cross), go low (death cross) - - for (let i = 0; i < 100; i++) { - let price; - - if (i < 20) { - // Start at 100, slight upward trend - price = 100 + i * 0.5; - } else if (i < 40) { - // Sharp downtrend from 110 to 70 (death cross around day 30) - price = 110 - (i - 20) * 2; - } else if (i < 60) { - // Sharp uptrend from 70 to 110 (golden cross around day 50) - price = 70 + (i - 40) * 2; - } else if (i < 80) { - // Sharp downtrend from 110 to 70 (death cross around day 70) - price = 110 - (i - 60) * 2; - } else { - // Stabilize around 70 - price = 70 + Math.sin((i - 80) * 0.3) * 2; - } - - const timestamp = startDate.getTime() + i * 86400000; - - bars.push({ - type: 'bar', - data: { - symbol: 'AAPL', - open: price - 0.5, - high: price + 1, - low: price - 1, - close: price, - volume: 1000000, - timestamp - } - }); - - if (i % 10 === 0) { - console.log(`Day ${i + 1}: Price = $${price.toFixed(2)}`); - } - } - - console.log('\nExpected crossovers:'); - console.log('- Death cross around day 30'); - console.log('- Golden cross around day 50'); - console.log('- Death cross around day 70\n'); - - data.set('AAPL', bars); - return data; - }; - - const config = { - mode: 'backtest' as const, - name: 'Clear Crossovers Test', - strategy: 'sma-crossover', - symbols: ['AAPL'], - startDate: '2023-01-01T00:00:00Z', - endDate: '2023-04-10T00:00:00Z', // 100 days - initialCapital: 100000, - dataFrequency: '1d', - commission: 0.001, - slippage: 0.0001, - speed: 'max' as const - }; - - await modeManager.initializeMode(config); - - try { - const result = await backtestEngine.runBacktest(config); - - console.log('\n=== Backtest Results ==='); - console.log(`Total Return: ${result.metrics.totalReturn.toFixed(2)}%`); - console.log(`Total Trades: ${result.metrics.totalTrades}`); - console.log(`Trades in history: ${result.trades.length}`); - console.log(`Win Rate: ${result.metrics.winRate.toFixed(2)}%`); - - console.log('\nTrade Details:'); - result.trades.forEach((trade, i) => { - const entry = new Date(trade.entryDate).toLocaleDateString(); - const exit = trade.exitDate ? new Date(trade.exitDate).toLocaleDateString() : 'OPEN'; - console.log(`Trade ${i + 1}: ${trade.side} ${trade.quantity} @ $${trade.entryPrice.toFixed(2)} (${entry}) -> ${exit === 'OPEN' ? 'OPEN' : `$${trade.exitPrice.toFixed(2)} (${exit})`} | P&L: ${trade.pnl.toFixed(2)}`); - }); - - } catch (error) { - console.error('Backtest failed:', error); - } -} - -testClearCrossovers().catch(console.error); \ No newline at end of file diff --git a/apps/stock/orchestrator/test-commission-detailed.ts b/apps/stock/orchestrator/test-commission-detailed.ts deleted file mode 100644 index 3fc353b..0000000 --- a/apps/stock/orchestrator/test-commission-detailed.ts +++ /dev/null @@ -1,120 +0,0 @@ -import { BacktestEngine } from './src/backtest/BacktestEngine'; -import { StrategyManager } from './src/strategies/StrategyManager'; -import { StorageService } from './src/services/StorageService'; -import { ModeManager } from './src/core/ModeManager'; -import { MarketDataService } from './src/services/MarketDataService'; -import { ExecutionService } from './src/services/ExecutionService'; -import { IServiceContainer } from '@stock-bot/di'; - -async function testCommissionDetailed() { - // Create service container with minimal logging - const container: IServiceContainer = { - logger: { - info: () => {}, - error: (msg: string, ...args: any[]) => console.error('[ERROR]', msg, ...args), - warn: () => {}, - debug: () => {}, - } as any, - custom: {} - }; - - // Initialize services - const storageService = new StorageService(); - const marketDataService = new MarketDataService(container); - const executionService = new ExecutionService(container); - const modeManager = new ModeManager(container, marketDataService, executionService, storageService); - const strategyManager = new StrategyManager(container); - - // Set services in container - container.custom = { - MarketDataService: marketDataService, - ExecutionService: executionService, - ModeManager: modeManager, - StorageService: storageService - }; - - // Test with moderate commission and slippage - const config = { - mode: 'backtest', - name: 'Commission Test', - strategy: 'sma-crossover', - symbols: ['AAPL'], - startDate: '2023-01-01T00:00:00Z', - endDate: '2023-02-28T00:00:00Z', // 2 months - initialCapital: 10000, - commission: 0.002, // 0.2% commission - slippage: 0.001, // 0.1% slippage - dataFrequency: '1d', - speed: 'max' - }; - - await modeManager.initializeMode(config); - const backtestEngine = new BacktestEngine(container, storageService, strategyManager); - - console.log('\n=== COMMISSION & SLIPPAGE TEST ==='); - console.log(`Initial Capital: $${config.initialCapital}`); - console.log(`Commission: ${(config.commission * 100).toFixed(2)}%`); - console.log(`Slippage: ${(config.slippage * 100).toFixed(2)}%`); - - const result = await backtestEngine.runBacktest(config); - - // Get P&L from Rust - const tradingEngine = strategyManager.getTradingEngine(); - const [realized, unrealized] = tradingEngine.getTotalPnl(); - - console.log('\n=== RESULTS ==='); - console.log(`Total Trades: ${result.trades.length}`); - console.log(`Final Portfolio Value: $${result.equity[result.equity.length - 1].value.toFixed(2)}`); - console.log(`Realized P&L: $${realized.toFixed(2)}`); - console.log(`Unrealized P&L: $${unrealized.toFixed(2)}`); - - if (result.trades.length > 0) { - console.log('\n=== TRADE DETAILS ==='); - let totalCommission = 0; - let totalSlippageCost = 0; - - result.trades.slice(0, 5).forEach((trade, idx) => { - const entryValue = trade.quantity * trade.entryPrice; - const exitValue = trade.quantity * trade.exitPrice; - - // Calculate expected slippage - // For a buy entry, we pay more (positive slippage) - // For a sell entry (short), we receive less (negative slippage) - const entrySlippage = trade.side === 'buy' ? - entryValue * config.slippage : - -entryValue * config.slippage; - - // For exit, it's opposite - const exitSlippage = trade.side === 'buy' ? - -exitValue * config.slippage : - exitValue * config.slippage; - - const expectedCommission = (entryValue + exitValue) * config.commission; - const slippageCost = entrySlippage + exitSlippage; - - totalCommission += trade.commission; - totalSlippageCost += slippageCost; - - console.log(`\nTrade ${idx + 1}: ${trade.symbol} ${trade.side}`); - console.log(` Quantity: ${trade.quantity} shares`); - console.log(` Entry: $${trade.entryPrice.toFixed(2)} (value: $${entryValue.toFixed(2)})`); - console.log(` Exit: $${trade.exitPrice.toFixed(2)} (value: $${exitValue.toFixed(2)})`); - console.log(` Commission: $${trade.commission.toFixed(2)} (expected: $${expectedCommission.toFixed(2)})`); - console.log(` Slippage Cost: $${slippageCost.toFixed(2)}`); - console.log(` Gross P&L: $${(exitValue - entryValue).toFixed(2)}`); - console.log(` Net P&L: $${trade.pnl.toFixed(2)}`); - }); - - console.log(`\n=== TOTALS ===`); - console.log(`Total Commission Paid: $${totalCommission.toFixed(2)}`); - console.log(`Total Slippage Cost: $${totalSlippageCost.toFixed(2)}`); - console.log(`Total Trading Costs: $${(totalCommission + totalSlippageCost).toFixed(2)}`); - } - - process.exit(0); -} - -testCommissionDetailed().catch(error => { - console.error('Test failed:', error); - process.exit(1); -}); \ No newline at end of file diff --git a/apps/stock/orchestrator/test-commission-slippage.ts b/apps/stock/orchestrator/test-commission-slippage.ts deleted file mode 100644 index 0b1b1d2..0000000 --- a/apps/stock/orchestrator/test-commission-slippage.ts +++ /dev/null @@ -1,123 +0,0 @@ -import { BacktestEngine } from './src/backtest/BacktestEngine'; -import { StrategyManager } from './src/strategies/StrategyManager'; -import { StorageService } from './src/services/StorageService'; -import { ModeManager } from './src/core/ModeManager'; -import { MarketDataService } from './src/services/MarketDataService'; -import { ExecutionService } from './src/services/ExecutionService'; -import { IServiceContainer } from '@stock-bot/di'; - -async function testCommissionSlippage() { - console.log('Testing Commission and Slippage...\n'); - - // Create service container - const container: IServiceContainer = { - logger: { - info: (msg: string, ...args: any[]) => console.log('[INFO]', msg, ...args), - error: (msg: string, ...args: any[]) => console.error('[ERROR]', msg, ...args), - warn: (msg: string, ...args: any[]) => console.warn('[WARN]', msg, ...args), - debug: (msg: string, ...args: any[]) => console.log('[DEBUG]', msg, ...args), - } as any, - custom: {} - }; - - // Initialize services - const storageService = new StorageService(); - const marketDataService = new MarketDataService(container); - const executionService = new ExecutionService(container); - const modeManager = new ModeManager(container, marketDataService, executionService, storageService); - const strategyManager = new StrategyManager(container); - - // Set services in container - container.custom = { - MarketDataService: marketDataService, - ExecutionService: executionService, - ModeManager: modeManager, - StorageService: storageService - }; - - // Test with high commission and slippage - const config = { - mode: 'backtest', - name: 'Commission Test', - strategy: 'sma-crossover', - symbols: ['AAPL'], - startDate: '2023-01-01T00:00:00Z', - endDate: '2023-01-31T00:00:00Z', - initialCapital: 10000, - commission: 0.01, // 1% commission (very high for testing) - slippage: 0.005, // 0.5% slippage (very high for testing) - dataFrequency: '1d', - speed: 'max' - }; - - // Initialize backtest mode - await modeManager.initializeMode(config); - - // Create backtest engine - const backtestEngine = new BacktestEngine(container, storageService, strategyManager); - - console.log('Running backtest with:'); - console.log(` Initial Capital: $${config.initialCapital}`); - console.log(` Commission: ${(config.commission * 100).toFixed(1)}%`); - console.log(` Slippage: ${(config.slippage * 100).toFixed(1)}%`); - - try { - const result = await backtestEngine.runBacktest(config); - - console.log('\n=== RESULTS ==='); - console.log(`Initial Capital: $${config.initialCapital}`); - console.log(`Final Value: $${result.equity[result.equity.length - 1].value.toFixed(2)}`); - console.log(`Total Return: ${result.metrics.totalReturn.toFixed(2)}%`); - console.log(`Total Trades: ${result.metrics.totalTrades}`); - - // Check trades for commission - if (result.trades.length > 0) { - console.log('\nFirst 3 trades with commission:'); - result.trades.slice(0, 3).forEach((t, idx) => { - const tradeValue = t.quantity * t.entryPrice; - const expectedCommission = tradeValue * config.commission; - const totalCost = tradeValue + expectedCommission; - - console.log(`\n${idx + 1}. ${t.symbol} ${t.side} ${t.quantity} shares`); - console.log(` Entry Price: $${t.entryPrice.toFixed(2)}`); - console.log(` Exit Price: $${t.exitPrice.toFixed(2)}`); - console.log(` Trade Value: $${tradeValue.toFixed(2)}`); - console.log(` Commission: $${t.commission.toFixed(2)} (expected: $${expectedCommission.toFixed(2)})`); - console.log(` P&L: $${t.pnl.toFixed(2)}`); - }); - } - - // Compare with zero commission/slippage - const zeroConfig = { - ...config, - commission: 0, - slippage: 0 - }; - - await modeManager.initializeMode(zeroConfig); - const zeroResult = await backtestEngine.runBacktest(zeroConfig); - - console.log('\n=== COMPARISON ==='); - console.log('With commission/slippage:'); - console.log(` Final Value: $${result.equity[result.equity.length - 1].value.toFixed(2)}`); - console.log(` Total Return: ${result.metrics.totalReturn.toFixed(2)}%`); - - console.log('\nWithout commission/slippage:'); - console.log(` Final Value: $${zeroResult.equity[zeroResult.equity.length - 1].value.toFixed(2)}`); - console.log(` Total Return: ${zeroResult.metrics.totalReturn.toFixed(2)}%`); - - const difference = zeroResult.equity[zeroResult.equity.length - 1].value - result.equity[result.equity.length - 1].value; - console.log(`\nCost of commission/slippage: $${difference.toFixed(2)}`); - - } catch (error) { - console.error('Backtest failed:', error); - } - - console.log('\n=== TEST COMPLETE ==='); - process.exit(0); -} - -testCommissionSlippage().catch(error => { - console.error('Test failed:', error); - process.exit(1); -}); \ No newline at end of file diff --git a/apps/stock/orchestrator/test-debug-returns.ts b/apps/stock/orchestrator/test-debug-returns.ts deleted file mode 100644 index 0f73c15..0000000 --- a/apps/stock/orchestrator/test-debug-returns.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { PerformanceAnalyzer } from './src/analytics/PerformanceAnalyzer'; - -// Test with simple data -const analyzer = new PerformanceAnalyzer(100000); - -// Add some equity points over 30 days -const startDate = new Date('2023-01-01'); -const values = [ - 100000, 101000, 100500, 102000, 101500, - 103000, 102500, 104000, 103500, 105000, - 104500, 106000, 105500, 107000, 106500, - 108000, 107500, 109000, 108500, 110000 -]; - -for (let i = 0; i < values.length; i++) { - const date = new Date(startDate); - date.setDate(date.getDate() + i); - analyzer.addEquityPoint(date, values[i]); - console.log(`Day ${i + 1}: ${date.toISOString().split('T')[0]} => $${values[i]}`); -} - -console.log('\n=== Analyzing Performance ==='); -const metrics = analyzer.analyze(); - -console.log(`\nTotal Return: ${metrics.totalReturn.toFixed(2)}%`); -console.log(`Annualized Return: ${metrics.annualizedReturn.toFixed(2)}%`); -console.log(`Volatility: ${metrics.volatility.toFixed(2)}%`); -console.log(`Sharpe Ratio: ${metrics.sharpeRatio.toFixed(3)}`); - -// Debug calculations -const finalValue = 110000; -const initialValue = 100000; -const totalReturn = ((finalValue - initialValue) / initialValue) * 100; -const days = 19; -const years = days / 365; -const annualizedReturn = (Math.pow(1 + totalReturn/100, 1/years) - 1) * 100; - -console.log('\n=== Manual Calculations ==='); -console.log(`Total Return: ${totalReturn.toFixed(2)}%`); -console.log(`Years: ${years.toFixed(4)}`); -console.log(`Annualized Return: ${annualizedReturn.toFixed(2)}%`); \ No newline at end of file diff --git a/apps/stock/orchestrator/test-equity-curve-debug.ts b/apps/stock/orchestrator/test-equity-curve-debug.ts deleted file mode 100644 index 7b236a8..0000000 --- a/apps/stock/orchestrator/test-equity-curve-debug.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { BacktestEngine } from './src/backtest/BacktestEngine'; -import { StrategyManager } from './src/strategies/StrategyManager'; -import { StorageService } from './src/services/StorageService'; -import { ModeManager } from './src/core/ModeManager'; -import { MarketDataService } from './src/services/MarketDataService'; -import { ExecutionService } from './src/services/ExecutionService'; -import { IServiceContainer } from '@stock-bot/di'; - -async function debugEquityCurve() { - // Create service container - const container: IServiceContainer = { - logger: { - info: (msg: string, ...args: any[]) => console.log('[INFO]', msg, ...args), - error: (msg: string, ...args: any[]) => console.error('[ERROR]', msg, ...args), - warn: (msg: string, ...args: any[]) => console.warn('[WARN]', msg, ...args), - debug: (msg: string, ...args: any[]) => console.log('[DEBUG]', msg, ...args), - } as any, - custom: {} - }; - - // Initialize services - const storageService = new StorageService(); - const marketDataService = new MarketDataService(container); - const executionService = new ExecutionService(container); - const modeManager = new ModeManager(container, marketDataService, executionService, storageService); - const strategyManager = new StrategyManager(container); - - // Set services in container - container.custom = { - MarketDataService: marketDataService, - ExecutionService: executionService, - ModeManager: modeManager, - StorageService: storageService - }; - - // Test with 5000 initial capital - const config = { - mode: 'backtest', - name: 'Debug', - strategy: 'sma-crossover', - symbols: ['AAPL'], - startDate: '2023-01-01T00:00:00Z', - endDate: '2023-01-05T00:00:00Z', // Just 5 days - initialCapital: 5000, - commission: 0.001, - slippage: 0.0001, - dataFrequency: '1d', - speed: 'max' - }; - - await modeManager.initializeMode(config); - const backtestEngine = new BacktestEngine(container, storageService, strategyManager); - - console.log('Before runBacktest - checking backtestEngine state...'); - - const result = await backtestEngine.runBacktest(config); - - console.log('\n=== EQUITY CURVE DEBUG ==='); - console.log(`Config Initial Capital: $${config.initialCapital}`); - console.log(`Number of equity points: ${result.equity.length}`); - - // Show all equity points - result.equity.forEach((point, idx) => { - console.log(` ${idx}: ${point.date} -> $${point.value.toFixed(2)}`); - }); - - process.exit(0); -} - -debugEquityCurve().catch(error => { - console.error('Test failed:', error); - process.exit(1); -}); \ No newline at end of file diff --git a/apps/stock/orchestrator/test-equity-curve-spike.ts b/apps/stock/orchestrator/test-equity-curve-spike.ts deleted file mode 100644 index 7b415af..0000000 --- a/apps/stock/orchestrator/test-equity-curve-spike.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { createContainer } from './src/simple-container'; -import { BacktestEngine } from './src/backtest/BacktestEngine'; -import { StrategyManager } from './src/strategies/StrategyManager'; -import { StorageService } from './src/services/StorageService'; - -async function testEquityCurveSpikeFixture() { - console.log('Testing equity curve spike fix...\n'); - - // Create minimal container - const container = await createContainer({ - database: { - mongodb: { enabled: false, uri: '' }, - postgres: { enabled: false, uri: '' }, - questdb: { enabled: false, host: '', port: 0 } - } - }); - - // Create services - const storageService = new StorageService(container); - const strategyManager = new StrategyManager(container); - - // Create backtest engine - const backtestEngine = new BacktestEngine(container, storageService, strategyManager); - - // Run a quick backtest - const config = { - mode: 'backtest', - name: 'Equity Curve Spike Test', - strategy: 'sma-crossover', - symbols: ['AAPL'], - startDate: '2023-01-01T00:00:00Z', - endDate: '2023-01-31T00:00:00Z', // Just one month - initialCapital: 100000, - commission: 0.001, - slippage: 0.0001, - dataFrequency: '1d', - speed: 'max' - }; - - console.log('Running backtest...'); - const result = await backtestEngine.runBacktest(config); - - // Check the equity curve - console.log('\n=== Equity Curve Analysis ==='); - console.log(`Initial Capital: $${config.initialCapital}`); - console.log(`Total equity points: ${result.equity.length}`); - - if (result.equity.length > 0) { - // Check first few points - console.log('\nFirst 5 equity curve points:'); - result.equity.slice(0, 5).forEach((point, index) => { - console.log(`${index + 1}. ${point.date}: $${point.value.toFixed(2)}`); - }); - - // Check for spike - const firstValue = result.equity[0].value; - const secondValue = result.equity.length > 1 ? result.equity[1].value : firstValue; - - console.log(`\nFirst equity value: $${firstValue.toFixed(2)}`); - console.log(`Second equity value: $${secondValue.toFixed(2)}`); - - // Check if there's a spike from 0 to initial capital - if (firstValue === 0 || firstValue < config.initialCapital * 0.5) { - console.log('\n❌ SPIKE DETECTED: First equity value is too low!'); - } else if (Math.abs(firstValue - config.initialCapital) < 1) { - console.log('\n✅ NO SPIKE: First equity value correctly starts at initial capital!'); - } else { - console.log(`\n⚠️ First equity value differs from initial capital by $${Math.abs(firstValue - config.initialCapital).toFixed(2)}`); - } - - // Check for duplicate timestamps - const timestamps = new Set(); - let duplicates = 0; - result.equity.forEach(point => { - if (timestamps.has(point.date)) { - duplicates++; - } - timestamps.add(point.date); - }); - - if (duplicates > 0) { - console.log(`\n⚠️ Found ${duplicates} duplicate timestamps in equity curve`); - } else { - console.log('\n✅ No duplicate timestamps found'); - } - } - - console.log('\n=== Test Complete ==='); - process.exit(0); -} - -testEquityCurveSpikeFixture().catch(error => { - console.error('Test failed:', error); - process.exit(1); -}); \ No newline at end of file diff --git a/apps/stock/orchestrator/test-equity-spike-simple.ts b/apps/stock/orchestrator/test-equity-spike-simple.ts deleted file mode 100644 index f02a7ad..0000000 --- a/apps/stock/orchestrator/test-equity-spike-simple.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { BacktestEngine } from './src/backtest/BacktestEngine'; -import { StrategyManager } from './src/strategies/StrategyManager'; -import { StorageService } from './src/services/StorageService'; -import { ModeManager } from './src/core/ModeManager'; -import { MarketDataService } from './src/services/MarketDataService'; -import { ExecutionService } from './src/services/ExecutionService'; -import { IServiceContainer } from '@stock-bot/di'; - -async function testEquitySpike() { - console.log('Testing equity curve spike fix...\n'); - - // Create minimal service container - const container: IServiceContainer = { - logger: { - info: (msg: string, ...args: any[]) => console.log('[INFO]', msg, ...args), - error: (msg: string, ...args: any[]) => console.error('[ERROR]', msg, ...args), - warn: (msg: string, ...args: any[]) => console.warn('[WARN]', msg, ...args), - debug: (msg: string, ...args: any[]) => console.log('[DEBUG]', msg, ...args), - } as any, - custom: {} - }; - - // Initialize services - const storageService = new StorageService(); - const marketDataService = new MarketDataService(container); - const executionService = new ExecutionService(container); - const modeManager = new ModeManager(container, marketDataService, executionService, storageService); - const strategyManager = new StrategyManager(container); - - // Set services in container - container.custom = { - MarketDataService: marketDataService, - ExecutionService: executionService, - ModeManager: modeManager, - StorageService: storageService - }; - - // Initialize backtest mode - await modeManager.initializeMode({ - mode: 'backtest', - startDate: '2023-01-01T00:00:00Z', - endDate: '2023-01-10T00:00:00Z', // Just 10 days - speed: 'max', - symbols: ['TEST'], - initialCapital: 100000, - dataFrequency: '1d', - strategy: 'sma-crossover' - }); - - // Create backtest engine - const backtestEngine = new BacktestEngine(container, storageService, strategyManager); - - // Run backtest - const config = { - mode: 'backtest', - name: 'Equity Spike Test', - strategy: 'sma-crossover', - symbols: ['TEST'], - startDate: '2023-01-01T00:00:00Z', - endDate: '2023-01-10T00:00:00Z', - initialCapital: 100000, - commission: 0.001, - slippage: 0.0001, - dataFrequency: '1d', - speed: 'max' - }; - - console.log('Running backtest...'); - const result = await backtestEngine.runBacktest(config); - - // Analyze equity curve - console.log('\n=== EQUITY CURVE ANALYSIS ==='); - console.log(`Initial Capital: $${config.initialCapital.toLocaleString()}`); - console.log(`Equity points: ${result.equity.length}`); - - if (result.equity.length > 0) { - console.log('\nFirst 3 equity points:'); - result.equity.slice(0, 3).forEach((point, i) => { - console.log(` ${i + 1}. ${point.date} => $${point.value.toFixed(2)}`); - }); - - const firstValue = result.equity[0].value; - const hasSpike = firstValue === 0 || firstValue < config.initialCapital * 0.9; - - console.log(`\nFirst value: $${firstValue.toFixed(2)}`); - console.log(`Expected: $${config.initialCapital.toFixed(2)}`); - console.log(`Difference: $${Math.abs(firstValue - config.initialCapital).toFixed(2)}`); - - if (hasSpike) { - console.log('\n❌ SPIKE DETECTED! Portfolio value starts at 0 or too low.'); - } else if (Math.abs(firstValue - config.initialCapital) < 1) { - console.log('\n✅ SUCCESS! Portfolio value correctly starts at initial capital.'); - } else { - console.log('\n⚠️ WARNING: Small difference detected, but no major spike.'); - } - } - - console.log('\n=== TEST COMPLETE ==='); - process.exit(0); -} - -testEquitySpike().catch(error => { - console.error('Test failed:', error); - process.exit(1); -}); \ No newline at end of file diff --git a/apps/stock/orchestrator/test-full-backtest.ts b/apps/stock/orchestrator/test-full-backtest.ts deleted file mode 100644 index a233a11..0000000 --- a/apps/stock/orchestrator/test-full-backtest.ts +++ /dev/null @@ -1,130 +0,0 @@ -import { BacktestEngine } from './src/backtest/BacktestEngine'; -import { StrategyManager } from './src/strategies/StrategyManager'; -import { StorageService } from './src/services/StorageService'; -import { ModeManager } from './src/core/ModeManager'; -import { MarketDataService } from './src/services/MarketDataService'; -import { ExecutionService } from './src/services/ExecutionService'; -import { IServiceContainer } from '@stock-bot/di'; - -async function testFullBacktest() { - console.log('Testing Full Backtest with Real Data...\n'); - - // Create service container - const container: IServiceContainer = { - logger: { - info: (msg: string, ...args: any[]) => console.log('[INFO]', msg, ...args), - error: (msg: string, ...args: any[]) => console.error('[ERROR]', msg, ...args), - warn: (msg: string, ...args: any[]) => console.warn('[WARN]', msg, ...args), - debug: (msg: string, ...args: any[]) => console.log('[DEBUG]', msg, ...args), - } as any, - custom: {} - }; - - // Initialize services - const storageService = new StorageService(); - const marketDataService = new MarketDataService(container); - const executionService = new ExecutionService(container); - const modeManager = new ModeManager(container, marketDataService, executionService, storageService); - const strategyManager = new StrategyManager(container); - - // Set services in container - container.custom = { - MarketDataService: marketDataService, - ExecutionService: executionService, - ModeManager: modeManager, - StorageService: storageService - }; - - // Test configuration matching what frontend might send - const config = { - mode: 'backtest', - name: 'Full Test', - strategy: 'sma-crossover', - symbols: ['AAPL', 'MSFT', 'GOOGL'], // Multiple symbols - startDate: '2023-01-01T00:00:00Z', - endDate: '2023-12-31T00:00:00Z', // Full year - initialCapital: 100000, - commission: 0.001, - slippage: 0.0001, - dataFrequency: '1d', - speed: 'max' - }; - - // Initialize backtest mode - await modeManager.initializeMode(config); - - // Create backtest engine - const backtestEngine = new BacktestEngine(container, storageService, strategyManager); - - console.log('Running full year backtest with multiple symbols...'); - const startTime = Date.now(); - - try { - const result = await backtestEngine.runBacktest(config); - - const duration = (Date.now() - startTime) / 1000; - console.log(`\nBacktest completed in ${duration.toFixed(2)} seconds`); - - // Check for data anomalies - console.log('\n=== RESULT ANALYSIS ==='); - console.log(`Total Return: ${result.metrics.totalReturn.toFixed(2)}%`); - console.log(`Sharpe Ratio: ${result.metrics.sharpeRatio.toFixed(3)}`); - console.log(`Max Drawdown: ${(result.metrics.maxDrawdown * 100).toFixed(2)}%`); - console.log(`Win Rate: ${result.metrics.winRate.toFixed(1)}%`); - console.log(`Total Trades: ${result.metrics.totalTrades}`); - console.log(`Trades Array Length: ${result.trades.length}`); - - // Check equity curve - console.log('\n=== EQUITY CURVE CHECK ==='); - console.log(`Equity Points: ${result.equity.length}`); - if (result.equity.length > 0) { - const first = result.equity[0]; - const last = result.equity[result.equity.length - 1]; - const max = Math.max(...result.equity.map(e => e.value)); - const min = Math.min(...result.equity.map(e => e.value)); - - console.log(`First: $${first.value.toFixed(2)}`); - console.log(`Last: $${last.value.toFixed(2)}`); - console.log(`Max: $${max.toFixed(2)}`); - console.log(`Min: $${min.toFixed(2)}`); - - // Check for exponential growth - const growthRatio = last.value / first.value; - if (growthRatio > 10) { - console.log('\n⚠️ WARNING: Detected possible exponential growth!'); - console.log(`Growth ratio: ${growthRatio.toFixed(2)}x`); - } - } - - // Sample some trades - console.log('\n=== TRADE SAMPLES ==='); - if (result.trades.length > 0) { - console.log('First 3 trades:'); - result.trades.slice(0, 3).forEach((t, i) => { - console.log(` ${i+1}. ${t.symbol} ${t.side} ${t.quantity} @ ${t.exitPrice.toFixed(2)} | P&L: $${t.pnl.toFixed(2)} (${t.pnlPercent.toFixed(2)}%)`); - }); - - if (result.trades.length > 3) { - console.log('\nLast 3 trades:'); - result.trades.slice(-3).forEach((t, i) => { - console.log(` ${i+1}. ${t.symbol} ${t.side} ${t.quantity} @ ${t.exitPrice.toFixed(2)} | P&L: $${t.pnl.toFixed(2)} (${t.pnlPercent.toFixed(2)}%)`); - }); - } - } - - // Check raw metrics object - console.log('\n=== RAW METRICS ==='); - console.log(JSON.stringify(result.metrics, null, 2)); - - } catch (error) { - console.error('Backtest failed:', error); - } - - console.log('\n=== TEST COMPLETE ==='); - process.exit(0); -} - -testFullBacktest().catch(error => { - console.error('Test failed:', error); - process.exit(1); -}); \ No newline at end of file diff --git a/apps/stock/orchestrator/test-full-flow.ts b/apps/stock/orchestrator/test-full-flow.ts deleted file mode 100644 index bb4d23d..0000000 --- a/apps/stock/orchestrator/test-full-flow.ts +++ /dev/null @@ -1,93 +0,0 @@ -#!/usr/bin/env bun - -/** - * Test the full flow from market data to trade execution - */ - -import { SimpleMovingAverageCrossover } from './src/strategies/examples/SimpleMovingAverageCrossover'; -import { BaseStrategy } from './src/strategies/BaseStrategy'; -import { MarketData } from './src/types'; -import { getLogger } from '@stock-bot/logger'; - -const logger = getLogger('test-flow'); - -async function testFullFlow() { - console.log('Testing full flow from market data to orders...\n'); - - // Create strategy - const config = { - id: 'test-sma', - name: 'Test SMA', - enabled: true, - symbols: ['AAPL'], - allocation: 1.0 - }; - - const strategy = new SimpleMovingAverageCrossover(config, null, null); - - let signalCount = 0; - let orderCount = 0; - - // Listen for signals - strategy.on('signal', (signal) => { - signalCount++; - logger.info(`Signal #${signalCount}:`, signal); - }); - - // Listen for orders - strategy.on('order', (order) => { - orderCount++; - logger.info(`Order #${orderCount}:`, order); - }); - - await strategy.start(); - - // Generate 50 days of data with a clear uptrend after day 20 - logger.info('Generating market data with uptrend...'); - - for (let day = 0; day < 50; day++) { - const basePrice = 100; - let price = basePrice; - - // Create a clear uptrend after day 20 - if (day > 20) { - price = basePrice + (day - 20) * 0.5; // 50 cents per day uptrend - } else { - price = basePrice + Math.sin(day * 0.3) * 2; // Sideways - } - - const marketData: MarketData = { - type: 'bar', - data: { - symbol: 'AAPL', - open: price - 0.5, - high: price + 0.5, - low: price - 1, - close: price, - volume: 1000000, - timestamp: Date.now() + day * 86400000 - } - }; - - // Process the data - await strategy.onMarketData(marketData); - - if (day === 19) { - logger.info(`Day 19: Last day before uptrend, price = ${price}`); - } - if (day === 25) { - logger.info(`Day 25: Should see golden cross soon, price = ${price}`); - } - } - - await strategy.stop(); - - console.log('\n=== Test Results ==='); - console.log(`Total signals generated: ${signalCount}`); - console.log(`Total orders generated: ${orderCount}`); - - const perf = strategy.getPerformance(); - console.log('Strategy performance:', perf); -} - -testFullFlow().catch(console.error); \ No newline at end of file diff --git a/apps/stock/orchestrator/test-initial-capital-debug.ts b/apps/stock/orchestrator/test-initial-capital-debug.ts deleted file mode 100644 index 62e5f85..0000000 --- a/apps/stock/orchestrator/test-initial-capital-debug.ts +++ /dev/null @@ -1,122 +0,0 @@ -import { BacktestEngine } from './src/backtest/BacktestEngine'; -import { StrategyManager } from './src/strategies/StrategyManager'; -import { StorageService } from './src/services/StorageService'; -import { ModeManager } from './src/core/ModeManager'; -import { MarketDataService } from './src/services/MarketDataService'; -import { ExecutionService } from './src/services/ExecutionService'; -import { IServiceContainer } from '@stock-bot/di'; - -async function testInitialCapitalDebug() { - console.log('Debugging Initial Capital Issue...\n'); - - // Create service container - const container: IServiceContainer = { - logger: { - info: (msg: string, ...args: any[]) => console.log('[INFO]', msg, ...args), - error: (msg: string, ...args: any[]) => console.error('[ERROR]', msg, ...args), - warn: (msg: string, ...args: any[]) => console.warn('[WARN]', msg, ...args), - debug: (msg: string, ...args: any[]) => console.log('[DEBUG]', msg, ...args), - } as any, - custom: {} - }; - - // Initialize services - const storageService = new StorageService(); - const marketDataService = new MarketDataService(container); - const executionService = new ExecutionService(container); - const modeManager = new ModeManager(container, marketDataService, executionService, storageService); - const strategyManager = new StrategyManager(container); - - // Set services in container - container.custom = { - MarketDataService: marketDataService, - ExecutionService: executionService, - ModeManager: modeManager, - StorageService: storageService - }; - - // Test with LOW initial capital - const config = { - mode: 'backtest', - name: 'Initial Capital Debug', - strategy: 'sma-crossover', - symbols: ['AAPL'], - startDate: '2023-01-01T00:00:00Z', - endDate: '2023-01-31T00:00:00Z', // Just one month - initialCapital: 1000, // LOW CAPITAL - commission: 0.001, - slippage: 0.0001, - dataFrequency: '1d', - speed: 'max' - }; - - // Initialize backtest mode - await modeManager.initializeMode(config); - - // Create backtest engine - const backtestEngine = new BacktestEngine(container, storageService, strategyManager); - - console.log('Running backtest with initial capital: $' + config.initialCapital); - - try { - const result = await backtestEngine.runBacktest(config); - - console.log('\n=== DEBUG INFO ==='); - console.log(`Initial Capital: $${config.initialCapital}`); - - // Check equity curve - console.log('\nEquity Curve:'); - result.equity.forEach((point, idx) => { - if (idx < 3 || idx >= result.equity.length - 3) { - console.log(` ${new Date(point.timestamp).toISOString()}: $${point.value.toFixed(2)}`); - } - if (idx === 3 && result.equity.length > 6) { - console.log(' ...'); - } - }); - - // Get trading engine to check P&L - const tradingEngine = strategyManager.getTradingEngine(); - if (tradingEngine) { - const [realized, unrealized] = tradingEngine.getTotalPnl(); - console.log(`\nRust Core P&L:`); - console.log(` Realized: $${realized.toFixed(2)}`); - console.log(` Unrealized: $${unrealized.toFixed(2)}`); - console.log(` Total P&L: $${(realized + unrealized).toFixed(2)}`); - console.log(` Expected Final Value: $${(config.initialCapital + realized + unrealized).toFixed(2)}`); - } - - // Check trades - console.log('\nTrades:'); - result.trades.forEach((t, idx) => { - console.log(` ${idx + 1}. ${t.symbol} ${t.side} ${t.quantity} @ $${t.entryPrice} -> $${t.exitPrice}`); - console.log(` P&L: $${t.pnl.toFixed(2)} (${t.pnlPercent.toFixed(2)}%)`); - }); - - // The issue calculation - const finalValue = result.equity[result.equity.length - 1].value; - console.log('\n=== ISSUE ANALYSIS ==='); - console.log(`Final portfolio value: $${finalValue.toFixed(2)}`); - console.log(`Initial capital: $${config.initialCapital}`); - console.log(`Difference: $${(finalValue - config.initialCapital).toFixed(2)}`); - console.log(`Return %: ${((finalValue - config.initialCapital) / config.initialCapital * 100).toFixed(2)}%`); - - // Check if it's using 100k - const assumedInitial = 100000; - const assumedReturn = (finalValue - assumedInitial) / assumedInitial * 100; - console.log(`\nIf initial was $100k:`); - console.log(` Return would be: ${assumedReturn.toFixed(2)}%`); - console.log(` P&L would be: $${(finalValue - assumedInitial).toFixed(2)}`); - - } catch (error) { - console.error('Backtest failed:', error); - } - - console.log('\n=== TEST COMPLETE ==='); - process.exit(0); -} - -testInitialCapitalDebug().catch(error => { - console.error('Test failed:', error); - process.exit(1); -}); \ No newline at end of file diff --git a/apps/stock/orchestrator/test-initial-capital-simple.ts b/apps/stock/orchestrator/test-initial-capital-simple.ts deleted file mode 100644 index f9a58c3..0000000 --- a/apps/stock/orchestrator/test-initial-capital-simple.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { BacktestEngine } from './src/backtest/BacktestEngine'; -import { StrategyManager } from './src/strategies/StrategyManager'; -import { StorageService } from './src/services/StorageService'; -import { ModeManager } from './src/core/ModeManager'; -import { MarketDataService } from './src/services/MarketDataService'; -import { ExecutionService } from './src/services/ExecutionService'; -import { IServiceContainer } from '@stock-bot/di'; - -async function testSimple() { - // Create service container - const container: IServiceContainer = { - logger: { - info: (msg: string, ...args: any[]) => {}, - error: (msg: string, ...args: any[]) => {}, - warn: (msg: string, ...args: any[]) => {}, - debug: (msg: string, ...args: any[]) => {}, - } as any, - custom: {} - }; - - // Initialize services - const storageService = new StorageService(); - const marketDataService = new MarketDataService(container); - const executionService = new ExecutionService(container); - const modeManager = new ModeManager(container, marketDataService, executionService, storageService); - const strategyManager = new StrategyManager(container); - - // Set services in container - container.custom = { - MarketDataService: marketDataService, - ExecutionService: executionService, - ModeManager: modeManager, - StorageService: storageService - }; - - // Test with 1000 initial capital - const config = { - mode: 'backtest', - name: 'Test', - strategy: 'sma-crossover', - symbols: ['AAPL'], - startDate: '2023-01-01T00:00:00Z', - endDate: '2023-01-31T00:00:00Z', - initialCapital: 1000, - commission: 0.001, - slippage: 0.0001, - dataFrequency: '1d', - speed: 'max' - }; - - await modeManager.initializeMode(config); - const backtestEngine = new BacktestEngine(container, storageService, strategyManager); - const result = await backtestEngine.runBacktest(config); - - // Get P&L from Rust - const tradingEngine = strategyManager.getTradingEngine(); - const [realized, unrealized] = tradingEngine.getTotalPnl(); - - console.log('\n=== RESULTS ==='); - console.log(`Config Initial Capital: $${config.initialCapital}`); - console.log(`First Equity Value: $${result.equity[0].value.toFixed(2)}`); - console.log(`Final Equity Value: $${result.equity[result.equity.length - 1].value.toFixed(2)}`); - console.log(`\nRust Core:`); - console.log(` Realized P&L: $${realized.toFixed(2)}`); - console.log(` Unrealized P&L: $${unrealized.toFixed(2)}`); - console.log(` Total P&L: $${(realized + unrealized).toFixed(2)}`); - console.log(`\nCalculated Final Value:`); - console.log(` $${config.initialCapital} + $${(realized + unrealized).toFixed(2)} = $${(config.initialCapital + realized + unrealized).toFixed(2)}`); - console.log(`\nActual vs Expected:`); - const actualFinal = result.equity[result.equity.length - 1].value; - const expectedFinal = config.initialCapital + realized + unrealized; - console.log(` Actual: $${actualFinal.toFixed(2)}`); - console.log(` Expected: $${expectedFinal.toFixed(2)}`); - console.log(` Difference: $${(actualFinal - expectedFinal).toFixed(2)}`); - - // Check if it's using 100k base - if (Math.abs(actualFinal - (100000 + realized + unrealized)) < 1) { - console.log('\n⚠️ BUG CONFIRMED: Using 100000 as base instead of ' + config.initialCapital); - } - - process.exit(0); -} - -testSimple().catch(error => { - console.error('Test failed:', error); - process.exit(1); -}); \ No newline at end of file diff --git a/apps/stock/orchestrator/test-initial-capital.ts b/apps/stock/orchestrator/test-initial-capital.ts deleted file mode 100644 index f620529..0000000 --- a/apps/stock/orchestrator/test-initial-capital.ts +++ /dev/null @@ -1,104 +0,0 @@ -import { BacktestEngine } from './src/backtest/BacktestEngine'; -import { StrategyManager } from './src/strategies/StrategyManager'; -import { StorageService } from './src/services/StorageService'; -import { ModeManager } from './src/core/ModeManager'; -import { MarketDataService } from './src/services/MarketDataService'; -import { ExecutionService } from './src/services/ExecutionService'; -import { IServiceContainer } from '@stock-bot/di'; - -async function testInitialCapital() { - console.log('Testing Initial Capital Issue...\n'); - - // Create service container - const container: IServiceContainer = { - logger: { - info: (msg: string, ...args: any[]) => console.log('[INFO]', msg, ...args), - error: (msg: string, ...args: any[]) => console.error('[ERROR]', msg, ...args), - warn: (msg: string, ...args: any[]) => console.warn('[WARN]', msg, ...args), - debug: (msg: string, ...args: any[]) => console.log('[DEBUG]', msg, ...args), - } as any, - custom: {} - }; - - // Initialize services - const storageService = new StorageService(); - const marketDataService = new MarketDataService(container); - const executionService = new ExecutionService(container); - const modeManager = new ModeManager(container, marketDataService, executionService, storageService); - const strategyManager = new StrategyManager(container); - - // Set services in container - container.custom = { - MarketDataService: marketDataService, - ExecutionService: executionService, - ModeManager: modeManager, - StorageService: storageService - }; - - // Test with LOW initial capital - const config = { - mode: 'backtest', - name: 'Initial Capital Test', - strategy: 'sma-crossover', - symbols: ['AAPL'], - startDate: '2023-01-01T00:00:00Z', - endDate: '2023-01-31T00:00:00Z', // Just one month - initialCapital: 1000, // LOW CAPITAL - commission: 0.001, - slippage: 0.0001, - dataFrequency: '1d', - speed: 'max' - }; - - // Initialize backtest mode - await modeManager.initializeMode(config); - - // Create backtest engine - const backtestEngine = new BacktestEngine(container, storageService, strategyManager); - - console.log('Running backtest with initial capital: $' + config.initialCapital); - - try { - const result = await backtestEngine.runBacktest(config); - - console.log('\n=== RESULTS ==='); - console.log(`Initial Capital: $${config.initialCapital}`); - console.log(`Final Value: $${result.equity[result.equity.length - 1].value.toFixed(2)}`); - console.log(`Total Return: ${result.metrics.totalReturn.toFixed(2)}%`); - console.log(`Total Trades: ${result.metrics.totalTrades}`); - - // Check if portfolio grew from 1000 - const finalValue = result.equity[result.equity.length - 1].value; - const expectedRange = config.initialCapital * 0.5; // Within 50% of initial - - if (Math.abs(finalValue - config.initialCapital) > expectedRange && - Math.abs(finalValue - 100000) < expectedRange) { - console.log('\n⚠️ WARNING: Portfolio appears to be using 100000 as initial capital!'); - } else { - console.log('\n✅ Portfolio appears to be using correct initial capital'); - } - - // Check first few trades - if (result.trades.length > 0) { - console.log('\nFirst trade:'); - const t = result.trades[0]; - console.log(` ${t.symbol} ${t.side} ${t.quantity} shares @ $${t.entryPrice}`); - console.log(` Trade value: $${(t.quantity * t.entryPrice).toFixed(2)}`); - - if (t.quantity * t.entryPrice > config.initialCapital) { - console.log(' ⚠️ WARNING: Trade size exceeds initial capital!'); - } - } - - } catch (error) { - console.error('Backtest failed:', error); - } - - console.log('\n=== TEST COMPLETE ==='); - process.exit(0); -} - -testInitialCapital().catch(error => { - console.error('Test failed:', error); - process.exit(1); -}); \ No newline at end of file diff --git a/apps/stock/orchestrator/test-mean-reversion.ts b/apps/stock/orchestrator/test-mean-reversion.ts deleted file mode 100644 index ba85313..0000000 --- a/apps/stock/orchestrator/test-mean-reversion.ts +++ /dev/null @@ -1,187 +0,0 @@ -import { RustBacktestAdapter } from './src/backtest/RustBacktestAdapter'; -import { IServiceContainer } from '@stock-bot/di'; -import { BacktestConfig } from './src/types'; - -// Mock container -const mockContainer: IServiceContainer = { - logger: { - info: console.log, - error: console.error, - warn: console.warn, - debug: console.log, - }, - mongodb: {} as any, - postgres: {} as any, - redis: {} as any, - custom: {}, -} as IServiceContainer; - -// Mock storage service that returns test data -class MockStorageService { - async getHistoricalBars(symbol: string, startDate: Date, endDate: Date, frequency: string) { - console.log(`MockStorageService: Getting bars for ${symbol} from ${startDate} to ${endDate}`); - - // Generate test data with mean reverting behavior - const bars = []; - const startTime = startDate.getTime(); - const endTime = endDate.getTime(); - const dayMs = 24 * 60 * 60 * 1000; - - let time = startTime; - let dayIndex = 0; - - // Base prices for different symbols - const basePrices = { - 'AAPL': 150, - 'GOOGL': 2800, - 'MSFT': 400, - }; - - const basePrice = basePrices[symbol as keyof typeof basePrices] || 100; - - while (time <= endTime) { - // Create mean reverting price movement - // Price oscillates around the base price with increasing then decreasing deviations - const cycleLength = 40; // 40 day cycle - const positionInCycle = dayIndex % cycleLength; - const halfCycle = cycleLength / 2; - - let deviation; - if (positionInCycle < halfCycle) { - // First half: price moves away from mean - deviation = (positionInCycle / halfCycle) * 0.1; // Up to 10% deviation - } else { - // Second half: price reverts to mean - deviation = ((cycleLength - positionInCycle) / halfCycle) * 0.1; - } - - // Alternate between above and below mean - const cycleNumber = Math.floor(dayIndex / cycleLength); - const multiplier = cycleNumber % 2 === 0 ? 1 : -1; - - const price = basePrice * (1 + multiplier * deviation); - - // Add some noise - const noise = (Math.random() - 0.5) * 0.02 * basePrice; - const finalPrice = price + noise; - - bars.push({ - timestamp: new Date(time), - open: finalPrice * 0.99, - high: finalPrice * 1.01, - low: finalPrice * 0.98, - close: finalPrice, - volume: 1000000, - vwap: finalPrice, - }); - - time += dayMs; - dayIndex++; - } - - console.log(`Generated ${bars.length} bars for ${symbol}, first close: ${bars[0].close.toFixed(2)}, last close: ${bars[bars.length - 1].close.toFixed(2)}`); - return bars; - } -} - -// Test the backtest -async function testMeanReversionBacktest() { - console.log('=== Testing Mean Reversion Backtest ===\n'); - - // Create adapter with mock storage - const adapter = new RustBacktestAdapter(mockContainer); - (adapter as any).storageService = new MockStorageService(); - - const config: BacktestConfig = { - name: 'Mean Reversion Test', - strategy: 'mean_reversion', - symbols: ['AAPL', 'GOOGL', 'MSFT'], - startDate: '2024-01-01T00:00:00Z', - endDate: '2024-06-01T00:00:00Z', - initialCapital: 100000, - commission: 0.001, - slippage: 0.0001, - dataFrequency: '1d', - config: { - lookbackPeriod: 20, - entryThreshold: 2.0, - positionSize: 100, - }, - }; - - try { - console.log('Starting backtest...\n'); - const result = await adapter.runBacktest(config); - - console.log('\n=== Backtest Results ==='); - console.log(`Status: ${result.status}`); - console.log(`Total Trades: ${result.metrics.totalTrades}`); - console.log(`Profitable Trades: ${result.metrics.profitableTrades}`); - console.log(`Win Rate: ${result.metrics.winRate.toFixed(2)}%`); - console.log(`Total Return: ${result.metrics.totalReturn.toFixed(2)}%`); - console.log(`Sharpe Ratio: ${result.metrics.sharpeRatio.toFixed(2)}`); - console.log(`Max Drawdown: ${result.metrics.maxDrawdown.toFixed(2)}%`); - - console.log('\n=== Trade Analysis ==='); - console.log(`Number of completed trades: ${result.trades.length}`); - - // Analyze trades by symbol - const tradesBySymbol: Record = {}; - result.trades.forEach(trade => { - if (!tradesBySymbol[trade.symbol]) { - tradesBySymbol[trade.symbol] = []; - } - tradesBySymbol[trade.symbol].push(trade); - }); - - Object.entries(tradesBySymbol).forEach(([symbol, trades]) => { - console.log(`\n${symbol}: ${trades.length} trades`); - const longTrades = trades.filter(t => t.side === 'long'); - const shortTrades = trades.filter(t => t.side === 'short'); - console.log(` - Long trades: ${longTrades.length}`); - console.log(` - Short trades: ${shortTrades.length}`); - - // Count buy/sell pairs - const buyTrades = trades.filter(t => t.side === 'buy'); - const sellTrades = trades.filter(t => t.side === 'sell'); - console.log(` - Buy trades: ${buyTrades.length}`); - console.log(` - Sell trades: ${sellTrades.length}`); - - // Show first few trades - console.log(` - First 3 trades:`); - trades.slice(0, 3).forEach((trade, idx) => { - console.log(` ${idx + 1}. Trade:`, JSON.stringify(trade, null, 2)); - }); - }); - - // Analyze trade pairing - console.log('\n=== Trade Pairing Analysis ==='); - console.log(`Total fills: ${result.trades.length}`); - console.log(`Expected pairs: ${result.trades.length / 2}`); - - // Look for patterns that show instant buy/sell - let instantPairs = 0; - for (let i = 1; i < result.trades.length; i++) { - const prev = result.trades[i-1]; - const curr = result.trades[i]; - if (prev.symbol === curr.symbol && - prev.side === 'buy' && curr.side === 'sell' && - new Date(curr.timestamp).getTime() - new Date(prev.timestamp).getTime() < 86400000) { - instantPairs++; - } - } - console.log(`Instant buy/sell pairs (< 1 day): ${instantPairs}`); - - // Final positions - console.log('\n=== Final Positions ==='); - Object.entries(result.finalPositions).forEach(([symbol, position]) => { - console.log(`${symbol}: ${position}`); - }); - - } catch (error) { - console.error('Backtest failed:', error); - } -} - -// Run the test -testMeanReversionBacktest().catch(console.error); \ No newline at end of file diff --git a/apps/stock/orchestrator/test-minimal-backtest.ts b/apps/stock/orchestrator/test-minimal-backtest.ts deleted file mode 100755 index b44ad64..0000000 --- a/apps/stock/orchestrator/test-minimal-backtest.ts +++ /dev/null @@ -1,80 +0,0 @@ -#!/usr/bin/env bun - -/** - * Minimal test to debug order flow - */ - -import { BacktestEngine } from './src/backtest/BacktestEngine'; -import { StrategyManager } from './src/strategies/StrategyManager'; -import { StorageService } from './src/services/StorageService'; -import { getLogger } from '@stock-bot/logger'; -import { TradingEngine } from '@stock-bot/core'; -import { ModeManager } from './src/core/ModeManager'; -import { MarketDataService } from './src/services/MarketDataService'; -import { ExecutionService } from './src/services/ExecutionService'; - -async function testMinimalBacktest() { - console.log('=== Minimal Backtest Test ===\n'); - - const logger = getLogger('test'); - const container = { - logger, - custom: {} - }; - - const storageService = new StorageService(container as any); - const marketDataService = new MarketDataService(container as any); - const executionService = new ExecutionService(container as any); - const modeManager = new ModeManager(container as any, marketDataService, executionService, storageService); - - // Add services to container - container.custom = { - ModeManager: modeManager, - MarketDataService: marketDataService, - ExecutionService: executionService - }; - - const strategyManager = new StrategyManager(container as any); - - // Add debug logging to strategy manager - const origHandleMarketData = (strategyManager as any).handleMarketData; - (strategyManager as any).handleMarketData = async function(data: any) { - console.log(`>>> StrategyManager.handleMarketData called for ${data.data.symbol} @ ${data.data.close}`); - console.log(` Active strategies: ${this.activeStrategies.size}`); - console.log(` Strategy IDs: ${Array.from(this.activeStrategies).join(', ')}`); - return origHandleMarketData.call(this, data); - }; - - const backtestEngine = new BacktestEngine(container as any, storageService, strategyManager); - - const config = { - mode: 'backtest' as const, - name: 'Minimal Test', - strategy: 'sma-crossover', - symbols: ['AAPL'], - startDate: '2023-01-01T00:00:00Z', - endDate: '2023-02-15T00:00:00Z', // 45 days to ensure we have enough data - initialCapital: 100000, - dataFrequency: '1d', - commission: 0.001, - slippage: 0.0001, - speed: 'max' as const - }; - - // Initialize mode manager with backtest config - await modeManager.initializeMode(config); - - try { - const result = await backtestEngine.runBacktest(config); - - console.log('\nResults:'); - console.log(`Total Return: ${result.metrics.totalReturn.toFixed(2)}%`); - console.log(`Total Trades: ${result.metrics.totalTrades}`); - console.log(`Trades in history: ${result.trades.length}`); - - } catch (error) { - console.error('Backtest failed:', error); - } -} - -testMinimalBacktest().catch(console.error); \ No newline at end of file diff --git a/apps/stock/orchestrator/test-order-flow.ts b/apps/stock/orchestrator/test-order-flow.ts deleted file mode 100755 index 3e2b9f0..0000000 --- a/apps/stock/orchestrator/test-order-flow.ts +++ /dev/null @@ -1,122 +0,0 @@ -#!/usr/bin/env bun - -/** - * Test order flow through the full backtest system - */ - -import { BacktestEngine } from './src/backtest/BacktestEngine'; -import { StrategyManager } from './src/strategies/StrategyManager'; -import { StorageService } from './src/services/StorageService'; -import { getLogger } from '@stock-bot/logger'; -import { SimpleMovingAverageCrossover } from './src/strategies/examples/SimpleMovingAverageCrossover'; - -async function testOrderFlow() { - console.log('Testing order flow in backtest...\n'); - - // Create minimal container - const logger = getLogger('test'); - const container = { - logger, - custom: {} - }; - - // Create services - const storageService = new StorageService(container as any); - const strategyManager = new StrategyManager(container as any); - - // First test the strategy directly - console.log('=== Testing Strategy Directly ==='); - const testStrategy = new SimpleMovingAverageCrossover({ - id: 'test-direct', - name: 'Direct Test', - enabled: true, - symbols: ['AAPL'], - allocation: 1.0 - }, null, null); - - let directSignals = 0; - let directOrders = 0; - - testStrategy.on('signal', (signal) => { - directSignals++; - console.log(`Direct signal #${directSignals}:`, signal); - }); - - testStrategy.on('order', (order) => { - directOrders++; - console.log(`Direct order #${directOrders}:`, order); - }); - - await testStrategy.start(); - - // Generate test data with clear crossover - for (let i = 0; i < 30; i++) { - const basePrice = 100; - const price = i < 15 ? basePrice - i * 0.5 : basePrice + (i - 15) * 0.5; - - await testStrategy.onMarketData({ - type: 'bar', - data: { - symbol: 'AAPL', - open: price, - high: price + 1, - low: price - 1, - close: price, - volume: 1000000, - timestamp: Date.now() + i * 86400000 - } - }); - } - - await testStrategy.stop(); - console.log(`\nDirect test: ${directSignals} signals, ${directOrders} orders\n`); - - // Now test through backtest engine - console.log('=== Testing Through Backtest Engine ==='); - - // Create backtest engine (it will initialize strategies) - const backtestEngine = new BacktestEngine(container as any, storageService, strategyManager); - - // Hook into backtest engine to see what's happening - const origProcessMarketData = (backtestEngine as any).processMarketData; - (backtestEngine as any).processMarketData = async function(data: any) { - console.log(`Processing market data: ${data.data.symbol} @ ${data.data.close}`); - return origProcessMarketData.call(this, data); - }; - - const origCheckAndFillOrders = (backtestEngine as any).checkAndFillOrders; - (backtestEngine as any).checkAndFillOrders = async function(data: any) { - const pendingCount = this.pendingOrders.size; - if (pendingCount > 0) { - console.log(`Checking ${pendingCount} pending orders...`); - } - return origCheckAndFillOrders.call(this, data); - }; - - const config = { - mode: 'backtest', - name: 'Order Flow Test', - strategy: 'sma-crossover', - symbols: ['AAPL'], - startDate: '2023-01-01T00:00:00Z', - endDate: '2023-02-01T00:00:00Z', // Just 1 month - initialCapital: 100000, - dataFrequency: '1d', - commission: 0.001, - slippage: 0.0001 - }; - - try { - const result = await backtestEngine.runBacktest(config); - - console.log('\nBacktest Results:'); - console.log(`Total Return: ${result.metrics.totalReturn.toFixed(2)}%`); - console.log(`Total Trades: ${result.metrics.totalTrades}`); - console.log(`Trades in history: ${result.trades.length}`); - - } catch (error) { - console.error('Backtest failed:', error); - } -} - -testOrderFlow().catch(console.error); \ No newline at end of file diff --git a/apps/stock/orchestrator/test-performance-metrics.ts b/apps/stock/orchestrator/test-performance-metrics.ts deleted file mode 100644 index 696a08d..0000000 --- a/apps/stock/orchestrator/test-performance-metrics.ts +++ /dev/null @@ -1,134 +0,0 @@ -import { BacktestEngine } from './src/backtest/BacktestEngine'; -import { StrategyManager } from './src/strategies/StrategyManager'; -import { StorageService } from './src/services/StorageService'; -import { ModeManager } from './src/core/ModeManager'; -import { MarketDataService } from './src/services/MarketDataService'; -import { ExecutionService } from './src/services/ExecutionService'; -import { IServiceContainer } from '@stock-bot/di'; - -async function testPerformanceMetrics() { - console.log('Testing Performance Metrics Calculation...\n'); - - // Create minimal service container - const container: IServiceContainer = { - logger: { - info: (msg: string, ...args: any[]) => console.log('[INFO]', msg, ...args), - error: (msg: string, ...args: any[]) => console.error('[ERROR]', msg, ...args), - warn: (msg: string, ...args: any[]) => console.warn('[WARN]', msg, ...args), - debug: (msg: string, ...args: any[]) => console.log('[DEBUG]', msg, ...args), - } as any, - custom: {} - }; - - // Initialize services - const storageService = new StorageService(); - const marketDataService = new MarketDataService(container); - const executionService = new ExecutionService(container); - const modeManager = new ModeManager(container, marketDataService, executionService, storageService); - const strategyManager = new StrategyManager(container); - - // Set services in container - container.custom = { - MarketDataService: marketDataService, - ExecutionService: executionService, - ModeManager: modeManager, - StorageService: storageService - }; - - // Initialize backtest mode - await modeManager.initializeMode({ - mode: 'backtest', - startDate: '2023-01-01T00:00:00Z', - endDate: '2023-03-31T00:00:00Z', // 3 months for more trades - speed: 'max', - symbols: ['AAPL'], - initialCapital: 100000, - dataFrequency: '1d', - strategy: 'sma-crossover' - }); - - // Create backtest engine - const backtestEngine = new BacktestEngine(container, storageService, strategyManager); - - // Run backtest - const config = { - mode: 'backtest', - name: 'Performance Metrics Test', - strategy: 'sma-crossover', - symbols: ['AAPL'], - startDate: '2023-01-01T00:00:00Z', - endDate: '2023-03-31T00:00:00Z', - initialCapital: 100000, - commission: 0.001, - slippage: 0.0001, - dataFrequency: '1d', - speed: 'max' - }; - - console.log('Running backtest...'); - const result = await backtestEngine.runBacktest(config); - - // Analyze metrics - console.log('\n=== PERFORMANCE METRICS ANALYSIS ==='); - console.log('\n📊 Returns:'); - console.log(` Total Return: ${result.metrics.totalReturn.toFixed(2)}%`); - console.log(` Sharpe Ratio: ${result.metrics.sharpeRatio.toFixed(3)}`); - console.log(` Max Drawdown: ${(result.metrics.maxDrawdown * 100).toFixed(2)}%`); - - console.log('\n📈 Trading Statistics:'); - console.log(` Total Trades: ${result.metrics.totalTrades}`); - console.log(` Win Rate: ${result.metrics.winRate.toFixed(2)}%`); - console.log(` Profit Factor: ${result.metrics.profitFactor.toFixed(2)}`); - console.log(` Average Win: $${result.metrics.avgWin.toFixed(2)}`); - console.log(` Average Loss: $${result.metrics.avgLoss.toFixed(2)}`); - - console.log('\n🎯 Trade Details:'); - console.log(` Closed Trades: ${result.trades.length}`); - if (result.trades.length > 0) { - const wins = result.trades.filter(t => t.pnl > 0); - const losses = result.trades.filter(t => t.pnl < 0); - console.log(` Winning Trades: ${wins.length}`); - console.log(` Losing Trades: ${losses.length}`); - console.log(` Calculated Win Rate: ${(wins.length / result.trades.length * 100).toFixed(2)}%`); - - // Show first few trades - console.log('\n First 3 trades:'); - result.trades.slice(0, 3).forEach((trade, i) => { - console.log(` ${i + 1}. ${trade.side} ${trade.quantity} @ ${trade.exitPrice.toFixed(2)} | P&L: $${trade.pnl.toFixed(2)} (${trade.pnlPercent.toFixed(2)}%)`); - }); - } - - console.log('\n💰 Equity Curve:'); - console.log(` Starting Capital: $${config.initialCapital.toLocaleString()}`); - console.log(` Final Value: $${result.equity[result.equity.length - 1].value.toFixed(2)}`); - console.log(` Equity Points: ${result.equity.length}`); - - // Show first and last few equity points - console.log('\n First 3 equity points:'); - result.equity.slice(0, 3).forEach((point, i) => { - console.log(` ${i + 1}. ${point.date} => $${point.value.toFixed(2)}`); - }); - - console.log('\n Last 3 equity points:'); - result.equity.slice(-3).forEach((point, i) => { - console.log(` ${i + 1}. ${point.date} => $${point.value.toFixed(2)}`); - }); - - // Diagnostic checks - console.log('\n🔍 Diagnostics:'); - const sharpeOK = result.metrics.sharpeRatio !== 0; - const drawdownOK = result.metrics.maxDrawdown > 0 && result.metrics.maxDrawdown < 0.99; - const winRateOK = result.metrics.winRate > 0 && result.metrics.winRate < 100; - - console.log(` ✅ Sharpe Ratio calculated: ${sharpeOK ? 'YES' : 'NO'}`); - console.log(` ✅ Max Drawdown reasonable: ${drawdownOK ? 'YES' : 'NO (suspicious value)'}`); - console.log(` ✅ Win Rate reasonable: ${winRateOK ? 'YES' : 'NO (check trade P&L)'}`); - - console.log('\n=== TEST COMPLETE ==='); - process.exit(0); -} - -testPerformanceMetrics().catch(error => { - console.error('Test failed:', error); - process.exit(1); -}); \ No newline at end of file diff --git a/apps/stock/orchestrator/test-portfolio-tracking.ts b/apps/stock/orchestrator/test-portfolio-tracking.ts deleted file mode 100644 index 6777a50..0000000 --- a/apps/stock/orchestrator/test-portfolio-tracking.ts +++ /dev/null @@ -1,109 +0,0 @@ -import { BacktestEngine } from './src/backtest/BacktestEngine'; -import { StrategyManager } from './src/strategies/StrategyManager'; -import { StorageService } from './src/services/StorageService'; -import { ModeManager } from './src/core/ModeManager'; -import { MarketDataService } from './src/services/MarketDataService'; -import { ExecutionService } from './src/services/ExecutionService'; -import { IServiceContainer } from '@stock-bot/di'; - -async function testPortfolioTracking() { - console.log('Testing Portfolio Value Tracking...\n'); - - // Create minimal service container - const container: IServiceContainer = { - logger: { - info: (msg: string, ...args: any[]) => { - // Filter for portfolio value messages - if (msg.includes('portfolio') || msg.includes('Portfolio') || msg.includes('equity')) { - console.log('[INFO]', msg, ...args); - } - }, - error: (msg: string, ...args: any[]) => console.error('[ERROR]', msg, ...args), - warn: (msg: string, ...args: any[]) => console.warn('[WARN]', msg, ...args), - debug: (msg: string, ...args: any[]) => {}, - } as any, - custom: {} - }; - - // Initialize services - const storageService = new StorageService(); - const marketDataService = new MarketDataService(container); - const executionService = new ExecutionService(container); - const modeManager = new ModeManager(container, marketDataService, executionService, storageService); - const strategyManager = new StrategyManager(container); - - // Set services in container - container.custom = { - MarketDataService: marketDataService, - ExecutionService: executionService, - ModeManager: modeManager, - StorageService: storageService - }; - - // Initialize backtest mode - await modeManager.initializeMode({ - mode: 'backtest', - startDate: '2023-01-01T00:00:00Z', - endDate: '2023-01-10T00:00:00Z', // Just 10 days - speed: 'max', - symbols: ['TEST'], - initialCapital: 100000, - dataFrequency: '1d', - strategy: 'sma-crossover' - }); - - // Create backtest engine - const backtestEngine = new BacktestEngine(container, storageService, strategyManager); - - // Run backtest - const config = { - mode: 'backtest', - name: 'Portfolio Tracking Test', - strategy: 'sma-crossover', - symbols: ['TEST'], - startDate: '2023-01-01T00:00:00Z', - endDate: '2023-01-10T00:00:00Z', - initialCapital: 100000, - commission: 0.001, - slippage: 0.0001, - dataFrequency: '1d', - speed: 'max' - }; - - console.log('Running backtest...'); - const result = await backtestEngine.runBacktest(config); - - // Analyze equity curve - console.log('\n=== EQUITY CURVE ANALYSIS ==='); - console.log(`Initial Capital: $${config.initialCapital.toLocaleString()}`); - console.log(`Equity Points: ${result.equity.length}`); - - // Show all equity points - console.log('\nAll equity points:'); - result.equity.forEach((point, i) => { - console.log(` ${i + 1}. ${point.date} => $${point.value.toFixed(2)}`); - }); - - // Check for anomalies - const firstValue = result.equity[0].value; - const lastValue = result.equity[result.equity.length - 1].value; - const totalReturn = ((lastValue - firstValue) / firstValue) * 100; - - console.log(`\nFirst Value: $${firstValue.toFixed(2)}`); - console.log(`Last Value: $${lastValue.toFixed(2)}`); - console.log(`Calculated Total Return: ${totalReturn.toFixed(2)}%`); - console.log(`Reported Total Return: ${result.metrics.totalReturn.toFixed(2)}%`); - - // Check if values match - if (Math.abs(totalReturn - result.metrics.totalReturn) > 0.01) { - console.log('\n❌ WARNING: Calculated return does not match reported return!'); - } - - console.log('\n=== TEST COMPLETE ==='); - process.exit(0); -} - -testPortfolioTracking().catch(error => { - console.error('Test failed:', error); - process.exit(1); -}); \ No newline at end of file diff --git a/apps/stock/orchestrator/test-predictable-backtest.ts b/apps/stock/orchestrator/test-predictable-backtest.ts deleted file mode 100755 index 55a3cd1..0000000 --- a/apps/stock/orchestrator/test-predictable-backtest.ts +++ /dev/null @@ -1,187 +0,0 @@ -#!/usr/bin/env bun - -/** - * Test with predictable data to ensure trades are generated - */ - -import { TradingEngine } from '@stock-bot/core'; -import { getLogger } from '@stock-bot/logger'; - -async function testPredictableBacktest() { - console.log('=== Predictable Backtest Test ===\n'); - - const logger = getLogger('test'); - - // Create trading engine directly - const tradingEngine = new TradingEngine('backtest', { - startTime: new Date('2023-01-01').getTime(), - endTime: new Date('2023-03-01').getTime(), - speedMultiplier: 0 - }); - - // Set initial capital - await tradingEngine.setCapital(100000); - - // Generate predictable price data that will cause crossovers - console.log('Generating predictable market data...'); - - // Phase 1: Downtrend (days 1-25) - prices fall from 100 to 75 - for (let i = 0; i < 25; i++) { - const price = 100 - i; - const timestamp = new Date('2023-01-01').getTime() + i * 86400000; - - await tradingEngine.advanceTime(timestamp); - await tradingEngine.updateQuote('AAPL', price - 0.01, price + 0.01, 10000, 10000); - - if (i % 5 === 0) { - console.log(`Day ${i + 1}: Price = $${price}`); - } - } - - // Phase 2: Uptrend (days 26-50) - prices rise from 76 to 100 - for (let i = 25; i < 50; i++) { - const price = 76 + (i - 25); - const timestamp = new Date('2023-01-01').getTime() + i * 86400000; - - await tradingEngine.advanceTime(timestamp); - await tradingEngine.updateQuote('AAPL', price - 0.01, price + 0.01, 10000, 10000); - - if (i % 5 === 0) { - console.log(`Day ${i + 1}: Price = $${price}`); - } - } - - // Phase 3: Another downtrend (days 51-60) - prices fall from 99 to 90 - for (let i = 50; i < 60; i++) { - const price = 100 - (i - 50); - const timestamp = new Date('2023-01-01').getTime() + i * 86400000; - - await tradingEngine.advanceTime(timestamp); - await tradingEngine.updateQuote('AAPL', price - 0.01, price + 0.01, 10000, 10000); - - if (i % 5 === 0) { - console.log(`Day ${i + 1}: Price = $${price}`); - } - } - - // Test moving averages manually - console.log('\n=== Expected Crossovers ==='); - console.log('Around day 35-40: Golden cross (10 SMA crosses above 20 SMA)'); - console.log('Around day 55-60: Death cross (10 SMA crosses below 20 SMA)'); - - // Get results - const closedTrades = tradingEngine.getClosedTrades ? JSON.parse(tradingEngine.getClosedTrades()) : []; - const tradeCount = tradingEngine.getTradeCount ? tradingEngine.getTradeCount() : 0; - const [realizedPnl, unrealizedPnl] = tradingEngine.getTotalPnl(); - - console.log('\n=== Results ==='); - console.log(`Total trades: ${tradeCount}`); - console.log(`Closed trades: ${closedTrades.length}`); - console.log(`Realized P&L: $${realizedPnl.toFixed(2)}`); - console.log(`Unrealized P&L: $${unrealizedPnl.toFixed(2)}`); - - // Now let's test the full backtest with this data pattern - console.log('\n=== Running Full Backtest with SMA Strategy ==='); - - const { BacktestEngine } = await import('./src/backtest/BacktestEngine'); - const { StrategyManager } = await import('./src/strategies/StrategyManager'); - const { StorageService } = await import('./src/services/StorageService'); - const { ModeManager } = await import('./src/core/ModeManager'); - const { MarketDataService } = await import('./src/services/MarketDataService'); - const { ExecutionService } = await import('./src/services/ExecutionService'); - const { DataManager } = await import('./src/data/DataManager'); - - const container = { - logger, - custom: {} - }; - - const storageService = new StorageService(container as any); - const marketDataService = new MarketDataService(container as any); - const executionService = new ExecutionService(container as any); - const modeManager = new ModeManager(container as any, marketDataService, executionService, storageService); - - container.custom = { - ModeManager: modeManager, - MarketDataService: marketDataService, - ExecutionService: executionService - }; - - const strategyManager = new StrategyManager(container as any); - const backtestEngine = new BacktestEngine(container as any, storageService, strategyManager); - - // Override the data manager to return our predictable data - const dataManager = new DataManager(container as any, storageService); - (backtestEngine as any).dataManager = dataManager; - - // Mock the loadHistoricalData to return our pattern - (dataManager as any).loadHistoricalData = async (symbols: string[], startDate: Date, endDate: Date) => { - const data = new Map(); - const bars = []; - - // Generate the same pattern as above - for (let i = 0; i < 60; i++) { - let price; - if (i < 25) { - price = 100 - i; - } else if (i < 50) { - price = 76 + (i - 25); - } else { - price = 100 - (i - 50); - } - - const timestamp = startDate.getTime() + i * 86400000; - bars.push({ - type: 'bar', - data: { - symbol: 'AAPL', - open: price - 0.5, - high: price + 0.5, - low: price - 0.5, - close: price, - volume: 1000000, - timestamp - } - }); - } - - data.set('AAPL', bars); - return data; - }; - - const config = { - mode: 'backtest' as const, - name: 'Predictable Test', - strategy: 'sma-crossover', - symbols: ['AAPL'], - startDate: '2023-01-01', - endDate: '2023-03-01', - initialCapital: 100000, - dataFrequency: '1d', - commission: 0.001, - slippage: 0.0001, - speed: 'max' as const - }; - - await modeManager.initializeMode(config); - - try { - const result = await backtestEngine.runBacktest(config); - - console.log('\nBacktest Results:'); - console.log(`Total Return: ${result.metrics.totalReturn.toFixed(2)}%`); - console.log(`Total Trades: ${result.metrics.totalTrades}`); - console.log(`Trades in history: ${result.trades.length}`); - console.log(`Win Rate: ${result.metrics.winRate.toFixed(2)}%`); - - console.log('\nTrade Details:'); - result.trades.forEach((trade, i) => { - console.log(`Trade ${i + 1}: ${trade.side} ${trade.quantity} @ $${trade.entryPrice.toFixed(2)} -> $${trade.exitPrice?.toFixed(2) || 'OPEN'}`); - }); - - } catch (error) { - console.error('Backtest failed:', error); - } -} - -testPredictableBacktest().catch(console.error); \ No newline at end of file diff --git a/apps/stock/orchestrator/test-quick-backtest.ts b/apps/stock/orchestrator/test-quick-backtest.ts deleted file mode 100644 index 4d2054d..0000000 --- a/apps/stock/orchestrator/test-quick-backtest.ts +++ /dev/null @@ -1,54 +0,0 @@ -#!/usr/bin/env bun - -/** - * Quick test of backtest with fixed order execution - */ - -import { createContainer } from './src/simple-container'; -import { BacktestEngine } from './src/backtest/BacktestEngine'; - -async function runQuickBacktest() { - const container = await createContainer(); - - const backtestEngine = container.resolve('backtestEngine') as BacktestEngine; - - const config = { - name: 'Quick SMA Test', - strategy: 'sma-crossover', - symbols: ['AAPL'], - startDate: '2020-01-01', - endDate: '2021-01-01', // Just 1 year for quick test - initialCapital: 100000, - dataFrequency: '1d', - commission: 0.001, - slippage: 0.0001 - }; - - console.log('Running quick backtest...\n'); - - try { - const result = await backtestEngine.runBacktest(config); - - console.log('Backtest Results:'); - console.log(`Total Return: ${result.metrics.totalReturn.toFixed(2)}%`); - console.log(`Total Trades: ${result.metrics.totalTrades}`); - console.log(`Win Rate: ${result.metrics.winRate.toFixed(2)}%`); - console.log(`Sharpe Ratio: ${result.metrics.sharpeRatio.toFixed(2)}`); - console.log(`Max Drawdown: ${result.metrics.maxDrawdown.toFixed(2)}%`); - console.log('\nTrade History:'); - console.log(`Trades in history: ${result.trades.length}`); - - result.trades.slice(0, 5).forEach(trade => { - console.log(`- ${trade.side} ${trade.quantity} @ $${trade.entryPrice} -> $${trade.exitPrice} (${trade.pnlPercent.toFixed(2)}%)`); - }); - - if (result.trades.length > 5) { - console.log(`... and ${result.trades.length - 5} more trades`); - } - - } catch (error) { - console.error('Backtest failed:', error); - } -} - -runQuickBacktest().catch(console.error); \ No newline at end of file diff --git a/apps/stock/orchestrator/test-rust-backtest.ts b/apps/stock/orchestrator/test-rust-backtest.ts deleted file mode 100644 index b64c31e..0000000 --- a/apps/stock/orchestrator/test-rust-backtest.ts +++ /dev/null @@ -1,145 +0,0 @@ -import { createRustBacktest } from './src/backtest/RustBacktestEngine'; -import { SimpleMovingAverageCrossoverRust } from './src/strategies/rust/SimpleMovingAverageCrossoverRust'; -import { IServiceContainer } from '@stock-bot/di'; - -// Mock StorageService -class MockStorageService { - async getHistoricalBars(symbol: string, startDate: Date, endDate: Date, frequency: string) { - // Generate mock data - const bars = []; - const msPerDay = 24 * 60 * 60 * 1000; - let currentDate = new Date(startDate); - let price = 100 + Math.random() * 50; // Start between 100-150 - - while (currentDate <= endDate) { - // Random walk - const change = (Math.random() - 0.5) * 2; // +/- 1% - price *= (1 + change / 100); - - bars.push({ - symbol, - timestamp: new Date(currentDate), - open: price * (1 + (Math.random() - 0.5) * 0.01), - high: price * (1 + Math.random() * 0.02), - low: price * (1 - Math.random() * 0.02), - close: price, - volume: 1000000 + Math.random() * 500000, - }); - - currentDate = new Date(currentDate.getTime() + msPerDay); - } - - return bars; - } -} - -async function testRustBacktest() { - console.log('🚀 Testing Rust Backtest Engine with TypeScript Strategy\n'); - - // Create minimal container - const container: IServiceContainer = { - logger: { - info: (msg: string, ...args: any[]) => console.log('[INFO]', msg, ...args), - error: (msg: string, ...args: any[]) => console.error('[ERROR]', msg, ...args), - warn: (msg: string, ...args: any[]) => console.warn('[WARN]', msg, ...args), - debug: (msg: string, ...args: any[]) => console.log('[DEBUG]', msg, ...args), - } as any, - custom: { - StorageService: new MockStorageService(), - } - }; - - // Backtest configuration - const config = { - mode: 'backtest' as const, - name: 'Rust Engine Test', - strategy: 'sma-crossover', - symbols: ['AAPL'], // Just one symbol for testing - startDate: '2023-01-01T00:00:00Z', - endDate: '2023-01-31T00:00:00Z', // Just one month for testing - initialCapital: 100000, - commission: 0.001, - slippage: 0.0001, - dataFrequency: '1d', - speed: 'max' as const, - }; - - // Create strategy - const strategy = new SimpleMovingAverageCrossoverRust({ - fastPeriod: 10, - slowPeriod: 30, - minHoldingBars: 5, - }); - - console.log('Configuration:'); - console.log(` Symbols: ${config.symbols.join(', ')}`); - console.log(` Period: ${config.startDate} to ${config.endDate}`); - console.log(` Initial Capital: $${config.initialCapital.toLocaleString()}`); - console.log(` Strategy: ${strategy.constructor.name}`); - console.log(''); - - try { - console.log('Running backtest in Rust engine...\n'); - const startTime = Date.now(); - - try { - const result = await createRustBacktest(container, config, [strategy]); - console.log('Raw result:', result); - - const duration = (Date.now() - startTime) / 1000; - - console.log(`\n✅ Backtest completed in ${duration.toFixed(2)} seconds`); - - if (!result || !result.metrics) { - console.error('Invalid result structure:', result); - return; - } - - console.log('\n=== PERFORMANCE METRICS ==='); - console.log(`Total Return: ${result.metrics.totalReturn?.toFixed(2) || 'N/A'}%`); - console.log(`Sharpe Ratio: ${result.metrics.sharpeRatio?.toFixed(2) || 'N/A'}`); - console.log(`Max Drawdown: ${result.metrics.maxDrawdown ? (result.metrics.maxDrawdown * 100).toFixed(2) : 'N/A'}%`); - console.log(`Win Rate: ${result.metrics.winRate?.toFixed(1) || 'N/A'}%`); - console.log(`Total Trades: ${result.metrics.totalTrades || 0}`); - console.log(`Profit Factor: ${result.metrics.profitFactor?.toFixed(2) || 'N/A'}`); - - console.log('\n=== TRADE STATISTICS ==='); - console.log(`Profitable Trades: ${result.metrics.profitableTrades || 0}`); - console.log(`Average Win: $${result.metrics.avgWin?.toFixed(2) || '0.00'}`); - console.log(`Average Loss: $${result.metrics.avgLoss?.toFixed(2) || '0.00'}`); - console.log(`Total P&L: $${result.metrics.totalPnl?.toFixed(2) || '0.00'}`); - - console.log('\n=== EQUITY CURVE ==='); - if (result.equityCurve.length > 0) { - const firstValue = result.equityCurve[0].value; - const lastValue = result.equityCurve[result.equityCurve.length - 1].value; - console.log(`Starting Value: $${firstValue.toLocaleString()}`); - console.log(`Ending Value: $${lastValue.toLocaleString()}`); - console.log(`Growth: ${((lastValue / firstValue - 1) * 100).toFixed(2)}%`); - } - - console.log('\n=== FINAL POSITIONS ==='); - const positions = Object.entries(result.finalPositions); - if (positions.length > 0) { - for (const [symbol, position] of positions) { - console.log(`${symbol}: ${position.quantity} shares @ $${position.averagePrice}`); - } - } else { - console.log('No open positions'); - } - - // Compare with TypeScript engine performance - console.log('\n=== PERFORMANCE COMPARISON ==='); - console.log('TypeScript Engine: ~5-10 seconds for 1 year backtest'); - console.log(`Rust Engine: ${duration.toFixed(2)} seconds`); - console.log(`Speed Improvement: ${(10 / duration).toFixed(1)}x faster`); - } catch (innerError) { - console.error('Result processing error:', innerError); - } - } catch (error) { - console.error('❌ Backtest failed:', error); - } -} - -// Run the test -testRustBacktest().catch(console.error); \ No newline at end of file diff --git a/apps/stock/orchestrator/test-sma-trades.ts b/apps/stock/orchestrator/test-sma-trades.ts deleted file mode 100755 index 061ad28..0000000 --- a/apps/stock/orchestrator/test-sma-trades.ts +++ /dev/null @@ -1,151 +0,0 @@ -#!/usr/bin/env bun - -/** - * Test SMA strategy directly to debug trading - */ - -import { SimpleMovingAverageCrossover } from './src/strategies/examples/SimpleMovingAverageCrossover'; -import { getLogger } from '@stock-bot/logger'; - -async function testSMAStrategy() { - console.log('=== Testing SMA Strategy Trading ===\n'); - - const logger = getLogger('test'); - - const config = { - id: 'test-sma', - name: 'Test SMA', - enabled: true, - symbols: ['AAPL'], - allocation: 1.0 - }; - - const strategy = new SimpleMovingAverageCrossover(config, null, null); - - let signalCount = 0; - let orderCount = 0; - const orders: any[] = []; - - strategy.on('signal', (signal) => { - signalCount++; - console.log(`\n📊 Signal #${signalCount}:`, { - type: signal.type, - symbol: signal.symbol, - strength: signal.strength, - reason: signal.reason - }); - }); - - strategy.on('order', (order) => { - orderCount++; - orders.push(order); - console.log(`\n📈 Order #${orderCount}:`, order); - }); - - await strategy.start(); - - // Generate clear pattern: downtrend then uptrend - console.log('Generating market data with clear trend changes...\n'); - - // Phase 1: Stable around 100 for first 10 days - for (let i = 0; i < 10; i++) { - const price = 100 + Math.sin(i * 0.5) * 2; - await strategy.onMarketData({ - type: 'bar', - data: { - symbol: 'AAPL', - open: price, - high: price + 1, - low: price - 1, - close: price, - volume: 1000000, - timestamp: Date.now() + i * 86400000 - } - }); - } - - // Phase 2: Clear downtrend from 100 to 80 (days 11-30) - for (let i = 10; i < 30; i++) { - const price = 100 - (i - 10); // Falls by $1 per day - await strategy.onMarketData({ - type: 'bar', - data: { - symbol: 'AAPL', - open: price, - high: price + 0.5, - low: price - 0.5, - close: price, - volume: 1000000, - timestamp: Date.now() + i * 86400000 - } - }); - } - - // Phase 3: Clear uptrend from 80 to 110 (days 31-60) - for (let i = 30; i < 60; i++) { - const price = 80 + (i - 30); // Rises by $1 per day - await strategy.onMarketData({ - type: 'bar', - data: { - symbol: 'AAPL', - open: price, - high: price + 0.5, - low: price - 0.5, - close: price, - volume: 1000000, - timestamp: Date.now() + i * 86400000 - } - }); - - // Simulate position update after first buy - if (i === 45 && orders.length > 0) { - console.log('\n🔄 Simulating position update after buy order...'); - await strategy.onOrderUpdate({ - orderId: 'test-order-1', - symbol: 'AAPL', - side: 'buy', - status: 'filled', - fills: [{ - quantity: orders[0].quantity, - price: 95 - }] - }); - } - } - - // Phase 4: Another downtrend from 110 to 90 (days 61-80) - for (let i = 60; i < 80; i++) { - const price = 110 - (i - 60); // Falls by $1 per day - - if (i % 5 === 0) { - console.log(`\nDay ${i + 1}: Price = $${price}`); - } - - await strategy.onMarketData({ - type: 'bar', - data: { - symbol: 'AAPL', - open: price, - high: price + 0.5, - low: price - 0.5, - close: price, - volume: 1000000, - timestamp: Date.now() + i * 86400000 - } - }); - } - - await strategy.stop(); - - console.log('\n=== Test Results ==='); - console.log(`Total signals generated: ${signalCount}`); - console.log(`Total orders generated: ${orderCount}`); - console.log(`\nExpected behavior:`); - console.log(`- Golden cross around day 40-45 (when 10 SMA crosses above 20 SMA)`); - console.log(`- Death cross around day 70-75 (when 10 SMA crosses below 20 SMA)`); - - const perf = strategy.getPerformance(); - console.log('\nStrategy performance:', perf); -} - -testSMAStrategy().catch(console.error); \ No newline at end of file diff --git a/apps/stock/orchestrator/test-strategy-signals.ts b/apps/stock/orchestrator/test-strategy-signals.ts deleted file mode 100644 index e09dcb8..0000000 --- a/apps/stock/orchestrator/test-strategy-signals.ts +++ /dev/null @@ -1,89 +0,0 @@ -#!/usr/bin/env bun - -/** - * Test strategy signal generation - */ - -import { SimpleMovingAverageCrossover } from './src/strategies/examples/SimpleMovingAverageCrossover'; -import { MarketData } from './src/types'; - -async function testStrategySignals() { - console.log('Testing strategy signal generation...\n'); - - // Create strategy with mock config - const config = { - id: 'test-sma', - name: 'Test SMA Strategy', - enabled: true, - symbols: ['AAPL'], - allocation: 1.0 - }; - - const strategy = new SimpleMovingAverageCrossover(config, null, null); - await strategy.start(); - - // Generate 100 days of mock data with a clear trend - const basePrice = 100; - let price = basePrice; - let signalCount = 0; - - console.log('Feeding market data to strategy...\n'); - - for (let day = 0; day < 100; day++) { - // Create uptrend for days 30-50, downtrend for days 60-80 - if (day >= 30 && day < 50) { - price += 0.5; // Uptrend - } else if (day >= 60 && day < 80) { - price -= 0.5; // Downtrend - } else { - price += (Math.random() - 0.5) * 0.2; // Small random movement - } - - const marketData: MarketData = { - type: 'bar', - data: { - symbol: 'AAPL', - open: price - 0.1, - high: price + 0.2, - low: price - 0.2, - close: price, - volume: 1000000, - timestamp: Date.now() + day * 86400000 - } - }; - - // Listen for signals - strategy.once('signal', (signal) => { - signalCount++; - console.log(`Day ${day}: Signal generated!`); - console.log(` Type: ${signal.type}`); - console.log(` Strength: ${signal.strength}`); - console.log(` Reason: ${signal.reason}`); - console.log(` Metadata:`, signal.metadata); - }); - - // Listen for orders - strategy.once('order', (order) => { - console.log(`Day ${day}: Order generated!`); - console.log(` Side: ${order.side}`); - console.log(` Quantity: ${order.quantity}`); - console.log(` Type: ${order.orderType}`); - }); - - // Process the market data - await strategy.onMarketData(marketData); - - if (day % 10 === 0) { - console.log(`Day ${day}: Price = ${price.toFixed(2)}, Total signals = ${signalCount}`); - } - } - - console.log(`\n✅ Test completed. Total signals generated: ${signalCount}`); - - const perf = strategy.getPerformance(); - console.log('\nStrategy Performance:', perf); - - await strategy.stop(); -} - -testStrategySignals().catch(console.error); \ No newline at end of file diff --git a/apps/stock/orchestrator/test-trade-format.ts b/apps/stock/orchestrator/test-trade-format.ts deleted file mode 100644 index 866adbc..0000000 --- a/apps/stock/orchestrator/test-trade-format.ts +++ /dev/null @@ -1,101 +0,0 @@ -import { RustBacktestAdapter } from './src/backtest/RustBacktestAdapter'; -import { IServiceContainer } from '@stock-bot/di'; -import { BacktestConfig } from './src/types'; - -// Mock container -const mockContainer: IServiceContainer = { - logger: { - info: console.log, - error: console.error, - warn: console.warn, - debug: console.log, - }, - mongodb: {} as any, - postgres: {} as any, - redis: {} as any, - custom: {}, -} as IServiceContainer; - -// Mock storage service -class MockStorageService { - async getHistoricalBars(symbol: string, startDate: Date, endDate: Date, frequency: string) { - const bars = []; - const startTime = startDate.getTime(); - const endTime = endDate.getTime(); - const dayMs = 24 * 60 * 60 * 1000; - - let time = startTime; - let dayIndex = 0; - - // Simple oscillating price for testing - while (time <= endTime) { - const price = 100 + 10 * Math.sin(dayIndex * 0.2); - - bars.push({ - timestamp: new Date(time), - open: price * 0.99, - high: price * 1.01, - low: price * 0.98, - close: price, - volume: 1000000, - vwap: price, - }); - - time += dayMs; - dayIndex++; - } - - return bars; - } -} - -// Test the backtest -async function testTradeFormat() { - console.log('=== Testing Trade Format ===\n'); - - const adapter = new RustBacktestAdapter(mockContainer); - (adapter as any).storageService = new MockStorageService(); - - const config: BacktestConfig = { - name: 'Trade Format Test', - strategy: 'Simple Moving Average Crossover', - symbols: ['TEST'], - startDate: '2024-01-01T00:00:00Z', - endDate: '2024-03-01T00:00:00Z', - initialCapital: 100000, - commission: 0.001, - slippage: 0.0001, - dataFrequency: '1d', - config: { - fastPeriod: 5, - slowPeriod: 15, - }, - }; - - try { - const result = await adapter.runBacktest(config); - - console.log('\n=== Trade Format ==='); - console.log('Number of trades:', result.trades.length); - console.log('\nFirst 3 trades:'); - result.trades.slice(0, 3).forEach((trade, idx) => { - console.log(`\nTrade ${idx + 1}:`, JSON.stringify(trade, null, 2)); - }); - - // Check what format the trades are in - if (result.trades.length > 0) { - const firstTrade = result.trades[0]; - console.log('\n=== Trade Structure Analysis ==='); - console.log('Keys:', Object.keys(firstTrade)); - console.log('Has entryDate/exitDate?', 'entryDate' in firstTrade && 'exitDate' in firstTrade); - console.log('Has timestamp?', 'timestamp' in firstTrade); - console.log('Has side field?', 'side' in firstTrade); - console.log('Side value:', firstTrade.side); - } - - } catch (error) { - console.error('Test failed:', error); - } -} - -testTradeFormat().catch(console.error); \ No newline at end of file diff --git a/apps/stock/orchestrator/test-trade-history.ts b/apps/stock/orchestrator/test-trade-history.ts deleted file mode 100644 index 098d243..0000000 --- a/apps/stock/orchestrator/test-trade-history.ts +++ /dev/null @@ -1,107 +0,0 @@ -#!/usr/bin/env bun - -/** - * Test the new trade history functionality - */ - -import { TradingEngine } from '@stock-bot/core'; - -async function testTradeHistory() { - console.log('Testing trade history functionality...\n'); - - // Create a trading engine in backtest mode - const config = { - startTime: Date.now() - 86400000, // 24 hours ago - endTime: Date.now(), - speedMultiplier: 1.0 - }; - - const engine = new TradingEngine('backtest', config as any); - - console.log('Trading engine created in', engine.getMode(), 'mode'); - console.log('Initial trade count:', engine.getTradeCount()); - console.log('Initial closed trades:', engine.getClosedTradeCount()); - - // Simulate some trades - console.log('\n--- Simulating trades ---'); - - // Buy 100 shares at $50 - console.log('Processing BUY: 100 shares @ $50'); - engine.processFillWithMetadata( - 'AAPL', - 50.0, - 100, - 'buy', - 1.0, - 'ORDER001', - 'STRATEGY001' - ); - - console.log('Trade count after buy:', engine.getTradeCount()); - console.log('Closed trades after buy:', engine.getClosedTradeCount()); - - // Sell 50 shares at $55 - console.log('\nProcessing SELL: 50 shares @ $55'); - engine.processFillWithMetadata( - 'AAPL', - 55.0, - 50, - 'sell', - 1.0, - 'ORDER002', - 'STRATEGY001' - ); - - console.log('Trade count after partial sell:', engine.getTradeCount()); - console.log('Closed trades after partial sell:', engine.getClosedTradeCount()); - - // Get closed trades - const closedTradesJson = engine.getClosedTrades(); - const closedTrades = JSON.parse(closedTradesJson); - - console.log('\n--- Closed Trades ---'); - closedTrades.forEach((trade: any) => { - console.log(`Trade ${trade.id}:`); - console.log(` Symbol: ${trade.symbol}`); - console.log(` Entry: ${trade.entry_price} @ ${new Date(trade.entry_time).toISOString()}`); - console.log(` Exit: ${trade.exit_price} @ ${new Date(trade.exit_time).toISOString()}`); - console.log(` Quantity: ${trade.quantity}`); - console.log(` P&L: $${trade.pnl.toFixed(2)} (${trade.pnl_percent.toFixed(2)}%)`); - console.log(` Duration: ${trade.duration_ms}ms`); - }); - - // Sell remaining 50 shares at $52 - console.log('\nProcessing SELL: 50 shares @ $52'); - engine.processFillWithMetadata( - 'AAPL', - 52.0, - 50, - 'sell', - 1.0, - 'ORDER003', - 'STRATEGY001' - ); - - console.log('Trade count after full close:', engine.getTradeCount()); - console.log('Closed trades after full close:', engine.getClosedTradeCount()); - - // Get all trade history - const allTradesJson = engine.getTradeHistory(); - const allTrades = JSON.parse(allTradesJson); - - console.log('\n--- All Trade History ---'); - console.log(`Total trades executed: ${allTrades.length}`); - allTrades.forEach((trade: any) => { - console.log(`${trade.id}: ${trade.side} ${trade.quantity} ${trade.symbol} @ ${trade.price}`); - }); - - // Get final P&L - const [realizedPnl, unrealizedPnl] = engine.getTotalPnl(); - console.log('\n--- Final P&L ---'); - console.log(`Realized P&L: $${realizedPnl.toFixed(2)}`); - console.log(`Unrealized P&L: $${unrealizedPnl.toFixed(2)}`); - - console.log('\n✅ Trade history test completed successfully!'); -} - -testTradeHistory().catch(console.error); \ No newline at end of file diff --git a/apps/stock/orchestrator/tests/indicators.test.ts b/apps/stock/orchestrator/tests/indicators.test.ts index dcb30cb..4c07bce 100644 --- a/apps/stock/orchestrator/tests/indicators.test.ts +++ b/apps/stock/orchestrator/tests/indicators.test.ts @@ -1,5 +1,5 @@ -import { TechnicalIndicators, IncrementalSMA, IncrementalEMA, IncrementalRSI } from '@stock-bot/core'; -import { TechnicalAnalysis, IncrementalIndicators, SignalGenerator } from '../src/indicators/TechnicalAnalysis'; +import { IncrementalSMA, TechnicalIndicators } from '@stock-bot/engine'; +import { IncrementalIndicators, SignalGenerator, TechnicalAnalysis } from '../src/indicators/TechnicalAnalysis'; describe('Technical Analysis Library', () => { let ta: TechnicalAnalysis; diff --git a/apps/wcag-ada/config/package.json b/apps/wcag-ada/config/package.json index 2051344..c09bf23 100644 --- a/apps/wcag-ada/config/package.json +++ b/apps/wcag-ada/config/package.json @@ -9,7 +9,7 @@ "typecheck": "tsc --noEmit" }, "dependencies": { - "@stock-bot/core-config": "workspace:*", + "@stock-bot/engine-config": "workspace:*", "zod": "^3.22.4" }, "devDependencies": { diff --git a/apps/wcag-ada/config/src/config-instance.ts b/apps/wcag-ada/config/src/config-instance.ts index 651b6b6..76e5b59 100644 --- a/apps/wcag-ada/config/src/config-instance.ts +++ b/apps/wcag-ada/config/src/config-instance.ts @@ -1,6 +1,6 @@ -import { ConfigManager, createAppConfig } from '@stock-bot/core-config'; -import { wcagAppConfigSchema, type WcagAppConfig } from './schemas/wcag-app.schema'; +import { ConfigManager, createAppConfig } from '@stock-bot/engine-config'; import * as path from 'path'; +import { wcagAppConfigSchema, type WcagAppConfig } from './schemas/wcag-app.schema'; let configInstance: ConfigManager | null = null; diff --git a/apps/wcag-ada/config/src/schemas/wcag-app.schema.ts b/apps/wcag-ada/config/src/schemas/wcag-app.schema.ts index d014f4a..2a7b7f7 100644 --- a/apps/wcag-ada/config/src/schemas/wcag-app.schema.ts +++ b/apps/wcag-ada/config/src/schemas/wcag-app.schema.ts @@ -1,14 +1,14 @@ -import { z } from 'zod'; -import { +import { baseAppConfigSchema, - logConfigSchema, databaseConfigSchema, + logConfigSchema, serviceConfigSchema, -} from '@stock-bot/core-config'; -import { scannerConfigSchema } from './scanner.schema'; -import { workerConfigSchema } from './worker.schema'; +} from '@stock-bot/engine-config'; +import { z } from 'zod'; import { featuresConfigSchema } from './features.schema'; import { providersConfigSchema } from './providers.schema'; +import { scannerConfigSchema } from './scanner.schema'; +import { workerConfigSchema } from './worker.schema'; // Service-specific configurations const wcagServicesSchema = z.object({ diff --git a/bun.lock b/bun.lock deleted file mode 100644 index 2ec5985..0000000 --- a/bun.lock +++ /dev/null @@ -1,3244 +0,0 @@ -{ - "lockfileVersion": 1, - "workspaces": { - "": { - "name": "stock-bot", - "dependencies": { - "@types/pg": "^8.15.4", - "awilix": "^12.0.5", - "bullmq": "^5.53.2", - }, - "devDependencies": { - "@eslint/js": "^9.28.0", - "@ianvs/prettier-plugin-sort-imports": "^4.4.2", - "@modelcontextprotocol/server-postgres": "^0.6.2", - "@testcontainers/mongodb": "^10.7.2", - "@testcontainers/postgresql": "^10.7.2", - "@types/bun": "^1.2.17", - "@types/supertest": "^6.0.2", - "@types/yup": "^0.32.0", - "@typescript-eslint/eslint-plugin": "^8.34.0", - "@typescript-eslint/parser": "^8.34.0", - "bun-types": "^1.2.15", - "eslint": "^9.28.0", - "eslint-plugin-import": "^2.31.0", - "eslint-plugin-node": "^11.1.0", - "eslint-plugin-promise": "^7.2.1", - "knip": "^5.61.2", - "mongodb-mcp-server": "^0.1.1", - "mongodb-memory-server": "^9.1.6", - "pg-mem": "^2.8.1", - "prettier": "^3.5.3", - "supertest": "^6.3.4", - "ts-unused-exports": "^11.0.1", - "tsx": "^4.20.3", - "turbo": "^2.5.4", - "typescript": "^5.8.3", - "yup": "^1.6.1", - }, - }, - "apps/stock": { - "name": "@stock-bot/stock-app", - "version": "1.0.0", - "devDependencies": { - "@types/node": "^20.11.0", - "turbo": "^2.5.4", - "typescript": "^5.3.3", - }, - }, - "apps/stock/config": { - "name": "@stock-bot/stock-config", - "version": "1.0.0", - "dependencies": { - "@stock-bot/config": "*", - "@stock-bot/logger": "*", - "zod": "^3.22.4", - }, - "devDependencies": { - "@types/node": "^20.11.0", - "typescript": "^5.3.3", - }, - }, - "apps/stock/core": { - "name": "@stock-bot/core", - "version": "1.0.0", - "devDependencies": { - "@napi-rs/cli": "^2.16.3", - "cargo-cp-artifact": "^0.1", - }, - }, - "apps/stock/data-ingestion": { - "name": "@stock-bot/data-ingestion", - "version": "1.0.0", - "dependencies": { - "@stock-bot/browser": "*", - "@stock-bot/cache": "*", - "@stock-bot/config": "*", - "@stock-bot/di": "*", - "@stock-bot/handlers": "*", - "@stock-bot/logger": "*", - "@stock-bot/mongodb": "*", - "@stock-bot/postgres": "*", - "@stock-bot/proxy": "*", - "@stock-bot/questdb": "*", - "@stock-bot/queue": "*", - "@stock-bot/shutdown": "*", - "@stock-bot/stock-config": "*", - "@stock-bot/utils": "*", - "hono": "^4.0.0", - }, - "devDependencies": { - "typescript": "^5.0.0", - }, - }, - "apps/stock/data-pipeline": { - "name": "@stock-bot/data-pipeline", - "version": "1.0.0", - "dependencies": { - "@stock-bot/cache": "*", - "@stock-bot/config": "*", - "@stock-bot/di": "*", - "@stock-bot/handlers": "*", - "@stock-bot/logger": "*", - "@stock-bot/mongodb": "*", - "@stock-bot/postgres": "*", - "@stock-bot/questdb": "*", - "@stock-bot/queue": "*", - "@stock-bot/shutdown": "*", - "@stock-bot/stock-config": "*", - "hono": "^4.0.0", - }, - "devDependencies": { - "typescript": "^5.0.0", - }, - }, - "apps/stock/orchestrator": { - "name": "@stock-bot/orchestrator", - "version": "0.1.0", - "dependencies": { - "@stock-bot/cache": "*", - "@stock-bot/config": "*", - "@stock-bot/di": "*", - "@stock-bot/logger": "*", - "@stock-bot/questdb": "*", - "@stock-bot/queue": "*", - "@stock-bot/shutdown": "*", - "@stock-bot/stock-config": "*", - "@stock-bot/utils": "*", - "axios": "^1.6.0", - "hono": "^4.0.0", - "simple-statistics": "^7.8.3", - "socket.io": "^4.7.2", - "socket.io-client": "^4.7.2", - "uuid": "^9.0.0", - "zod": "^3.22.0", - }, - "devDependencies": { - "@types/node": "^20.0.0", - "typescript": "^5.0.0", - }, - }, - "apps/stock/web-api": { - "name": "@stock-bot/web-api", - "version": "1.0.0", - "dependencies": { - "@stock-bot/config": "*", - "@stock-bot/di": "*", - "@stock-bot/handlers": "*", - "@stock-bot/logger": "*", - "@stock-bot/mongodb": "*", - "@stock-bot/postgres": "*", - "@stock-bot/shutdown": "*", - "@stock-bot/stock-config": "*", - "hono": "^4.0.0", - }, - "devDependencies": { - "typescript": "^5.0.0", - }, - }, - "apps/stock/web-app": { - "name": "@stock-bot/web-app", - "version": "0.1.0", - "dependencies": { - "@headlessui/react": "^1.7.17", - "@heroicons/react": "^2.0.18", - "@hookform/resolvers": "^3.3.4", - "@tanstack/react-table": "^8.21.3", - "clsx": "^2.1.1", - "date-fns": "^3.3.1", - "lightweight-charts": "^4.1.3", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-hook-form": "^7.49.3", - "react-router-dom": "^7.6.2", - "react-virtuoso": "^4.12.8", - "recharts": "^2.10.4", - "tailwind-merge": "^3.3.1", - "zod": "^3.22.4", - }, - "devDependencies": { - "@types/react": "^18.2.15", - "@types/react-dom": "^18.2.7", - "@typescript-eslint/eslint-plugin": "^6.0.0", - "@typescript-eslint/parser": "^6.0.0", - "@vitejs/plugin-react": "^4.0.3", - "autoprefixer": "^10.4.14", - "eslint": "^8.45.0", - "eslint-plugin-react": "^7.32.2", - "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-react-refresh": "^0.4.3", - "postcss": "^8.4.27", - "tailwindcss": "^3.3.3", - "typescript": "^5.0.2", - "vite": "^4.4.5", - }, - }, - "libs/core/cache": { - "name": "@stock-bot/cache", - "version": "1.0.0", - "dependencies": { - "@stock-bot/logger": "*", - "ioredis": "^5.3.2", - }, - "devDependencies": { - "@types/node": "^20.11.0", - "bun-types": "^1.2.15", - "typescript": "^5.3.0", - }, - }, - "libs/core/config": { - "name": "@stock-bot/config", - "version": "1.0.0", - "bin": { - "config-cli": "./dist/cli.js", - }, - "dependencies": { - "@stock-bot/logger": "workspace:*", - "zod": "^3.22.4", - }, - "devDependencies": { - "@types/bun": "^1.0.0", - "@types/node": "^20.10.5", - "typescript": "^5.3.3", - }, - }, - "libs/core/di": { - "name": "@stock-bot/di", - "version": "1.0.0", - "dependencies": { - "@stock-bot/browser": "workspace:*", - "@stock-bot/cache": "workspace:*", - "@stock-bot/config": "workspace:*", - "@stock-bot/handler-registry": "workspace:*", - "@stock-bot/handlers": "workspace:*", - "@stock-bot/logger": "workspace:*", - "@stock-bot/mongodb": "workspace:*", - "@stock-bot/postgres": "workspace:*", - "@stock-bot/proxy": "workspace:*", - "@stock-bot/questdb": "workspace:*", - "@stock-bot/queue": "workspace:*", - "@stock-bot/shutdown": "workspace:*", - "@stock-bot/types": "workspace:*", - "awilix": "^12.0.5", - "glob": "^10.0.0", - "hono": "^4.0.0", - "zod": "^3.23.8", - }, - "devDependencies": { - "@types/pg": "^8.10.7", - }, - }, - "libs/core/event-bus": { - "name": "@stock-bot/event-bus", - "version": "1.0.0", - "dependencies": { - "@stock-bot/logger": "*", - "eventemitter3": "^5.0.1", - "ioredis": "^5.3.2", - }, - "devDependencies": { - "@types/node": "^20.11.0", - "bun-types": "^1.2.15", - "typescript": "^5.3.0", - }, - }, - "libs/core/handler-registry": { - "name": "@stock-bot/handler-registry", - "version": "1.0.0", - "dependencies": { - "@stock-bot/types": "workspace:*", - }, - "devDependencies": { - "@types/bun": "*", - "typescript": "*", - }, - }, - "libs/core/handlers": { - "name": "@stock-bot/handlers", - "version": "1.0.0", - "dependencies": { - "@stock-bot/cache": "workspace:*", - "@stock-bot/config": "workspace:*", - "@stock-bot/handler-registry": "workspace:*", - "@stock-bot/logger": "workspace:*", - "@stock-bot/types": "workspace:*", - "@stock-bot/utils": "workspace:*", - "mongodb": "^6.12.0", - }, - "devDependencies": { - "@types/node": "^20.11.0", - "bun-types": "^1.2.15", - "typescript": "^5.3.0", - }, - }, - "libs/core/logger": { - "name": "@stock-bot/logger", - "version": "1.0.0", - "dependencies": { - "got": "^14.4.7", - "pino": "^9.7.0", - "pino-loki": "^2.6.0", - "pino-pretty": "^13.0.0", - }, - "devDependencies": { - "@types/node": "^20.11.0", - "bun-types": "^1.2.15", - "typescript": "^5.3.0", - }, - }, - "libs/core/queue": { - "name": "@stock-bot/queue", - "version": "1.0.0", - "dependencies": { - "@stock-bot/cache": "*", - "@stock-bot/handler-registry": "*", - "@stock-bot/logger": "*", - "@stock-bot/types": "*", - "bullmq": "^5.0.0", - "ioredis": "^5.3.0", - "rate-limiter-flexible": "^3.0.0", - }, - "devDependencies": { - "@types/node": "^20.0.0", - "testcontainers": "^10.0.0", - "typescript": "^5.3.0", - }, - }, - "libs/core/shutdown": { - "name": "@stock-bot/shutdown", - "version": "1.0.0", - "dependencies": { - "@stock-bot/logger": "workspace:*", - }, - "devDependencies": { - "@types/node": "^20.0.0", - "typescript": "^5.0.0", - }, - }, - "libs/core/types": { - "name": "@stock-bot/types", - "version": "1.0.0", - "devDependencies": { - "@types/node": "^20.11.0", - "bun-types": "^1.2.15", - "typescript": "^5.3.0", - }, - }, - "libs/data/mongodb": { - "name": "@stock-bot/mongodb", - "version": "1.0.0", - "dependencies": { - "@stock-bot/logger": "*", - "@stock-bot/types": "*", - "@types/mongodb": "^4.0.7", - "mongodb": "^6.17.0", - }, - "devDependencies": { - "@types/node": "^20.11.0", - "@typescript-eslint/eslint-plugin": "^6.19.0", - "@typescript-eslint/parser": "^6.19.0", - "bun-types": "^1.2.15", - "eslint": "^8.56.0", - "typescript": "^5.3.0", - }, - }, - "libs/data/postgres": { - "name": "@stock-bot/postgres", - "version": "1.0.0", - "dependencies": { - "@stock-bot/logger": "*", - "@stock-bot/types": "*", - "pg": "^8.11.3", - }, - "devDependencies": { - "@types/node": "^20.11.0", - "@types/pg": "^8.10.7", - "@typescript-eslint/eslint-plugin": "^6.19.0", - "@typescript-eslint/parser": "^6.19.0", - "bun-types": "^1.2.15", - "eslint": "^8.56.0", - "typescript": "^5.3.0", - }, - }, - "libs/data/questdb": { - "name": "@stock-bot/questdb", - "version": "1.0.0", - "dependencies": { - "@stock-bot/logger": "*", - "@stock-bot/types": "*", - "pg": "^8.11.3", - }, - "devDependencies": { - "@types/node": "^20.11.0", - "@typescript-eslint/eslint-plugin": "^6.19.0", - "@typescript-eslint/parser": "^6.19.0", - "bun-types": "^1.2.15", - "eslint": "^8.56.0", - "typescript": "^5.3.0", - }, - }, - "libs/services/browser": { - "name": "@stock-bot/browser", - "version": "1.0.0", - "dependencies": { - "playwright": "^1.53.0", - }, - "devDependencies": { - "@types/node": "^20.0.0", - "typescript": "^5.0.0", - }, - "peerDependencies": { - "@stock-bot/logger": "workspace:*", - }, - }, - "libs/services/proxy": { - "name": "@stock-bot/proxy", - "version": "0.1.0", - "dependencies": { - "@stock-bot/cache": "workspace:*", - "@stock-bot/logger": "workspace:*", - }, - "devDependencies": { - "typescript": "^5.0.0", - }, - }, - "libs/utils": { - "name": "@stock-bot/utils", - "version": "1.0.0", - "dependencies": { - "@stock-bot/cache": "workspace:*", - "@stock-bot/config": "workspace:*", - "@stock-bot/logger": "workspace:*", - "@stock-bot/types": "workspace:*", - }, - "devDependencies": { - "@types/node": "^20.11.0", - "bun-types": "^1.2.15", - "typescript": "^5.3.0", - }, - }, - "tools/coverage-cli": { - "name": "@stock-bot/coverage-cli", - "version": "1.0.0", - "bin": { - "stock-bot-coverage": "./dist/index.js", - }, - "dependencies": { - "chalk": "^5.3.0", - "commander": "^11.1.0", - "glob": "^10.3.10", - "handlebars": "^4.7.8", - "lcov-parse": "^1.0.0", - "table": "^6.8.1", - }, - "devDependencies": { - "@types/glob": "^8.1.0", - "@types/lcov-parse": "^1.0.0", - "@types/node": "^20.10.5", - "bun-types": "^1.0.18", - }, - }, - }, - "trustedDependencies": [ - "esbuild", - "mongodb-memory-server", - "mongodb", - ], - "packages": { - "@alloc/quick-lru": ["@alloc/quick-lru@5.2.0", "", {}, "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw=="], - - "@ampproject/remapping": ["@ampproject/remapping@2.3.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw=="], - - "@aws-crypto/sha256-browser": ["@aws-crypto/sha256-browser@5.2.0", "", { "dependencies": { "@aws-crypto/sha256-js": "^5.2.0", "@aws-crypto/supports-web-crypto": "^5.2.0", "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", "@aws-sdk/util-locate-window": "^3.0.0", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.6.2" } }, "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw=="], - - "@aws-crypto/sha256-js": ["@aws-crypto/sha256-js@5.2.0", "", { "dependencies": { "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", "tslib": "^2.6.2" } }, "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA=="], - - "@aws-crypto/supports-web-crypto": ["@aws-crypto/supports-web-crypto@5.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg=="], - - "@aws-crypto/util": ["@aws-crypto/util@5.2.0", "", { "dependencies": { "@aws-sdk/types": "^3.222.0", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.6.2" } }, "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ=="], - - "@aws-sdk/client-cognito-identity": ["@aws-sdk/client-cognito-identity@3.830.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.826.0", "@aws-sdk/credential-provider-node": "3.830.0", "@aws-sdk/middleware-host-header": "3.821.0", "@aws-sdk/middleware-logger": "3.821.0", "@aws-sdk/middleware-recursion-detection": "3.821.0", "@aws-sdk/middleware-user-agent": "3.828.0", "@aws-sdk/region-config-resolver": "3.821.0", "@aws-sdk/types": "3.821.0", "@aws-sdk/util-endpoints": "3.828.0", "@aws-sdk/util-user-agent-browser": "3.821.0", "@aws-sdk/util-user-agent-node": "3.828.0", "@smithy/config-resolver": "^4.1.4", "@smithy/core": "^3.5.3", "@smithy/fetch-http-handler": "^5.0.4", "@smithy/hash-node": "^4.0.4", "@smithy/invalid-dependency": "^4.0.4", "@smithy/middleware-content-length": "^4.0.4", "@smithy/middleware-endpoint": "^4.1.11", "@smithy/middleware-retry": "^4.1.12", "@smithy/middleware-serde": "^4.0.8", "@smithy/middleware-stack": "^4.0.4", "@smithy/node-config-provider": "^4.1.3", "@smithy/node-http-handler": "^4.0.6", "@smithy/protocol-http": "^5.1.2", "@smithy/smithy-client": "^4.4.3", "@smithy/types": "^4.3.1", "@smithy/url-parser": "^4.0.4", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", "@smithy/util-defaults-mode-browser": "^4.0.19", "@smithy/util-defaults-mode-node": "^4.0.19", "@smithy/util-endpoints": "^3.0.6", "@smithy/util-middleware": "^4.0.4", "@smithy/util-retry": "^4.0.5", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-YhhQNVmHykPC6h6Xj60BMG7ELxxlynwNW2wK+8HJRiT62nYhbDyHypY9W2zNshqh/SE+5gLvwt1sXAu7KHGWmQ=="], - - "@aws-sdk/client-sso": ["@aws-sdk/client-sso@3.830.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.826.0", "@aws-sdk/middleware-host-header": "3.821.0", "@aws-sdk/middleware-logger": "3.821.0", "@aws-sdk/middleware-recursion-detection": "3.821.0", "@aws-sdk/middleware-user-agent": "3.828.0", "@aws-sdk/region-config-resolver": "3.821.0", "@aws-sdk/types": "3.821.0", "@aws-sdk/util-endpoints": "3.828.0", "@aws-sdk/util-user-agent-browser": "3.821.0", "@aws-sdk/util-user-agent-node": "3.828.0", "@smithy/config-resolver": "^4.1.4", "@smithy/core": "^3.5.3", "@smithy/fetch-http-handler": "^5.0.4", "@smithy/hash-node": "^4.0.4", "@smithy/invalid-dependency": "^4.0.4", "@smithy/middleware-content-length": "^4.0.4", "@smithy/middleware-endpoint": "^4.1.11", "@smithy/middleware-retry": "^4.1.12", "@smithy/middleware-serde": "^4.0.8", "@smithy/middleware-stack": "^4.0.4", "@smithy/node-config-provider": "^4.1.3", "@smithy/node-http-handler": "^4.0.6", "@smithy/protocol-http": "^5.1.2", "@smithy/smithy-client": "^4.4.3", "@smithy/types": "^4.3.1", "@smithy/url-parser": "^4.0.4", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", "@smithy/util-defaults-mode-browser": "^4.0.19", "@smithy/util-defaults-mode-node": "^4.0.19", "@smithy/util-endpoints": "^3.0.6", "@smithy/util-middleware": "^4.0.4", "@smithy/util-retry": "^4.0.5", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-5zCEpfI+zwX2SIa258L+TItNbBoAvQQ6w74qdFM6YJufQ1F9tvwjTX8T+eSTT9nsFIvfYnUaGalWwJVfmJUgVQ=="], - - "@aws-sdk/core": ["@aws-sdk/core@3.826.0", "", { "dependencies": { "@aws-sdk/types": "3.821.0", "@aws-sdk/xml-builder": "3.821.0", "@smithy/core": "^3.5.3", "@smithy/node-config-provider": "^4.1.3", "@smithy/property-provider": "^4.0.4", "@smithy/protocol-http": "^5.1.2", "@smithy/signature-v4": "^5.1.2", "@smithy/smithy-client": "^4.4.3", "@smithy/types": "^4.3.1", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-middleware": "^4.0.4", "@smithy/util-utf8": "^4.0.0", "fast-xml-parser": "4.4.1", "tslib": "^2.6.2" } }, "sha512-BGbQYzWj3ps+dblq33FY5tz/SsgJCcXX0zjQlSC07tYvU1jHTUvsefphyig+fY38xZ4wdKjbTop+KUmXUYrOXw=="], - - "@aws-sdk/credential-provider-cognito-identity": ["@aws-sdk/credential-provider-cognito-identity@3.830.0", "", { "dependencies": { "@aws-sdk/client-cognito-identity": "3.830.0", "@aws-sdk/types": "3.821.0", "@smithy/property-provider": "^4.0.4", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-YEXmJ1BJ6DzjNnW5OR/5yNPm5d19uifKM6n/1Q1+vooj0OC/zxO9rXo5uQ8Kjs7ZAb0uYSxzy5pTNi5Ilvs8+Q=="], - - "@aws-sdk/credential-provider-env": ["@aws-sdk/credential-provider-env@3.826.0", "", { "dependencies": { "@aws-sdk/core": "3.826.0", "@aws-sdk/types": "3.821.0", "@smithy/property-provider": "^4.0.4", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-DK3pQY8+iKK3MGDdC3uOZQ2psU01obaKlTYhEwNu4VWzgwQL4Vi3sWj4xSWGEK41vqZxiRLq6fOq7ysRI+qEZA=="], - - "@aws-sdk/credential-provider-http": ["@aws-sdk/credential-provider-http@3.826.0", "", { "dependencies": { "@aws-sdk/core": "3.826.0", "@aws-sdk/types": "3.821.0", "@smithy/fetch-http-handler": "^5.0.4", "@smithy/node-http-handler": "^4.0.6", "@smithy/property-provider": "^4.0.4", "@smithy/protocol-http": "^5.1.2", "@smithy/smithy-client": "^4.4.3", "@smithy/types": "^4.3.1", "@smithy/util-stream": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-N+IVZBh+yx/9GbMZTKO/gErBi/FYZQtcFRItoLbY+6WU+0cSWyZYfkoeOxHmQV3iX9k65oljERIWUmL9x6OSQg=="], - - "@aws-sdk/credential-provider-ini": ["@aws-sdk/credential-provider-ini@3.830.0", "", { "dependencies": { "@aws-sdk/core": "3.826.0", "@aws-sdk/credential-provider-env": "3.826.0", "@aws-sdk/credential-provider-http": "3.826.0", "@aws-sdk/credential-provider-process": "3.826.0", "@aws-sdk/credential-provider-sso": "3.830.0", "@aws-sdk/credential-provider-web-identity": "3.830.0", "@aws-sdk/nested-clients": "3.830.0", "@aws-sdk/types": "3.821.0", "@smithy/credential-provider-imds": "^4.0.6", "@smithy/property-provider": "^4.0.4", "@smithy/shared-ini-file-loader": "^4.0.4", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-zeQenzvh8JRY5nULd8izdjVGoCM1tgsVVsrLSwDkHxZTTW0hW/bmOmXfvdaE0wDdomXW7m2CkQDSmP7XdvNXZg=="], - - "@aws-sdk/credential-provider-node": ["@aws-sdk/credential-provider-node@3.830.0", "", { "dependencies": { "@aws-sdk/credential-provider-env": "3.826.0", "@aws-sdk/credential-provider-http": "3.826.0", "@aws-sdk/credential-provider-ini": "3.830.0", "@aws-sdk/credential-provider-process": "3.826.0", "@aws-sdk/credential-provider-sso": "3.830.0", "@aws-sdk/credential-provider-web-identity": "3.830.0", "@aws-sdk/types": "3.821.0", "@smithy/credential-provider-imds": "^4.0.6", "@smithy/property-provider": "^4.0.4", "@smithy/shared-ini-file-loader": "^4.0.4", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-X/2LrTgwtK1pkWrvofxQBI8VTi6QVLtSMpsKKPPnJQ0vgqC0e4czSIs3ZxiEsOkCBaQ2usXSiKyh0ccsQ6k2OA=="], - - "@aws-sdk/credential-provider-process": ["@aws-sdk/credential-provider-process@3.826.0", "", { "dependencies": { "@aws-sdk/core": "3.826.0", "@aws-sdk/types": "3.821.0", "@smithy/property-provider": "^4.0.4", "@smithy/shared-ini-file-loader": "^4.0.4", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-kURrc4amu3NLtw1yZw7EoLNEVhmOMRUTs+chaNcmS+ERm3yK0nKjaJzmKahmwlTQTSl3wJ8jjK7x962VPo+zWw=="], - - "@aws-sdk/credential-provider-sso": ["@aws-sdk/credential-provider-sso@3.830.0", "", { "dependencies": { "@aws-sdk/client-sso": "3.830.0", "@aws-sdk/core": "3.826.0", "@aws-sdk/token-providers": "3.830.0", "@aws-sdk/types": "3.821.0", "@smithy/property-provider": "^4.0.4", "@smithy/shared-ini-file-loader": "^4.0.4", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-+VdRpZmfekzpySqZikAKx6l5ndnLGluioIgUG4ZznrButgFD/iogzFtGmBDFB3ZLViX1l4pMXru0zFwJEZT21Q=="], - - "@aws-sdk/credential-provider-web-identity": ["@aws-sdk/credential-provider-web-identity@3.830.0", "", { "dependencies": { "@aws-sdk/core": "3.826.0", "@aws-sdk/nested-clients": "3.830.0", "@aws-sdk/types": "3.821.0", "@smithy/property-provider": "^4.0.4", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-hPYrKsZeeOdLROJ59T6Y8yZ0iwC/60L3qhZXjapBFjbqBtMaQiMTI645K6xVXBioA6vxXq7B4aLOhYqk6Fy/Ww=="], - - "@aws-sdk/credential-providers": ["@aws-sdk/credential-providers@3.834.0", "", { "dependencies": { "@aws-sdk/client-cognito-identity": "3.830.0", "@aws-sdk/core": "3.826.0", "@aws-sdk/credential-provider-cognito-identity": "3.830.0", "@aws-sdk/credential-provider-env": "3.826.0", "@aws-sdk/credential-provider-http": "3.826.0", "@aws-sdk/credential-provider-ini": "3.830.0", "@aws-sdk/credential-provider-node": "3.830.0", "@aws-sdk/credential-provider-process": "3.826.0", "@aws-sdk/credential-provider-sso": "3.830.0", "@aws-sdk/credential-provider-web-identity": "3.830.0", "@aws-sdk/nested-clients": "3.830.0", "@aws-sdk/types": "3.821.0", "@smithy/config-resolver": "^4.1.4", "@smithy/core": "^3.5.3", "@smithy/credential-provider-imds": "^4.0.6", "@smithy/node-config-provider": "^4.1.3", "@smithy/property-provider": "^4.0.4", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-ORIWCrLuqJnJg0fuI0rPhwaeuzqnIIJsbSkg1WV2XuiOpWXwLC/CfzhAbelQAv07/sRywZMnKqws0OOWg/ieYg=="], - - "@aws-sdk/middleware-host-header": ["@aws-sdk/middleware-host-header@3.821.0", "", { "dependencies": { "@aws-sdk/types": "3.821.0", "@smithy/protocol-http": "^5.1.2", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-xSMR+sopSeWGx5/4pAGhhfMvGBHioVBbqGvDs6pG64xfNwM5vq5s5v6D04e2i+uSTj4qGa71dLUs5I0UzAK3sw=="], - - "@aws-sdk/middleware-logger": ["@aws-sdk/middleware-logger@3.821.0", "", { "dependencies": { "@aws-sdk/types": "3.821.0", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-0cvI0ipf2tGx7fXYEEN5fBeZDz2RnHyb9xftSgUsEq7NBxjV0yTZfLJw6Za5rjE6snC80dRN8+bTNR1tuG89zA=="], - - "@aws-sdk/middleware-recursion-detection": ["@aws-sdk/middleware-recursion-detection@3.821.0", "", { "dependencies": { "@aws-sdk/types": "3.821.0", "@smithy/protocol-http": "^5.1.2", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-efmaifbhBoqKG3bAoEfDdcM8hn1psF+4qa7ykWuYmfmah59JBeqHLfz5W9m9JoTwoKPkFcVLWZxnyZzAnVBOIg=="], - - "@aws-sdk/middleware-user-agent": ["@aws-sdk/middleware-user-agent@3.828.0", "", { "dependencies": { "@aws-sdk/core": "3.826.0", "@aws-sdk/types": "3.821.0", "@aws-sdk/util-endpoints": "3.828.0", "@smithy/core": "^3.5.3", "@smithy/protocol-http": "^5.1.2", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-nixvI/SETXRdmrVab4D9LvXT3lrXkwAWGWk2GVvQvzlqN1/M/RfClj+o37Sn4FqRkGH9o9g7Fqb1YqZ4mqDAtA=="], - - "@aws-sdk/nested-clients": ["@aws-sdk/nested-clients@3.830.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.826.0", "@aws-sdk/middleware-host-header": "3.821.0", "@aws-sdk/middleware-logger": "3.821.0", "@aws-sdk/middleware-recursion-detection": "3.821.0", "@aws-sdk/middleware-user-agent": "3.828.0", "@aws-sdk/region-config-resolver": "3.821.0", "@aws-sdk/types": "3.821.0", "@aws-sdk/util-endpoints": "3.828.0", "@aws-sdk/util-user-agent-browser": "3.821.0", "@aws-sdk/util-user-agent-node": "3.828.0", "@smithy/config-resolver": "^4.1.4", "@smithy/core": "^3.5.3", "@smithy/fetch-http-handler": "^5.0.4", "@smithy/hash-node": "^4.0.4", "@smithy/invalid-dependency": "^4.0.4", "@smithy/middleware-content-length": "^4.0.4", "@smithy/middleware-endpoint": "^4.1.11", "@smithy/middleware-retry": "^4.1.12", "@smithy/middleware-serde": "^4.0.8", "@smithy/middleware-stack": "^4.0.4", "@smithy/node-config-provider": "^4.1.3", "@smithy/node-http-handler": "^4.0.6", "@smithy/protocol-http": "^5.1.2", "@smithy/smithy-client": "^4.4.3", "@smithy/types": "^4.3.1", "@smithy/url-parser": "^4.0.4", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", "@smithy/util-defaults-mode-browser": "^4.0.19", "@smithy/util-defaults-mode-node": "^4.0.19", "@smithy/util-endpoints": "^3.0.6", "@smithy/util-middleware": "^4.0.4", "@smithy/util-retry": "^4.0.5", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-5N5YTlBr1vtxf7+t+UaIQ625KEAmm7fY9o1e3MgGOi/paBoI0+axr3ud24qLIy0NSzFlAHEaxUSWxcERNjIoZw=="], - - "@aws-sdk/region-config-resolver": ["@aws-sdk/region-config-resolver@3.821.0", "", { "dependencies": { "@aws-sdk/types": "3.821.0", "@smithy/node-config-provider": "^4.1.3", "@smithy/types": "^4.3.1", "@smithy/util-config-provider": "^4.0.0", "@smithy/util-middleware": "^4.0.4", "tslib": "^2.6.2" } }, "sha512-t8og+lRCIIy5nlId0bScNpCkif8sc0LhmtaKsbm0ZPm3sCa/WhCbSZibjbZ28FNjVCV+p0D9RYZx0VDDbtWyjw=="], - - "@aws-sdk/token-providers": ["@aws-sdk/token-providers@3.830.0", "", { "dependencies": { "@aws-sdk/core": "3.826.0", "@aws-sdk/nested-clients": "3.830.0", "@aws-sdk/types": "3.821.0", "@smithy/property-provider": "^4.0.4", "@smithy/shared-ini-file-loader": "^4.0.4", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-aJ4guFwj92nV9D+EgJPaCFKK0I3y2uMchiDfh69Zqnmwfxxxfxat6F79VA7PS0BdbjRfhLbn+Ghjftnomu2c1g=="], - - "@aws-sdk/types": ["@aws-sdk/types@3.821.0", "", { "dependencies": { "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-Znroqdai1a90TlxGaJ+FK1lwC0fHpo97Xjsp5UKGR5JODYm7f9+/fF17ebO1KdoBr/Rm0UIFiF5VmI8ts9F1eA=="], - - "@aws-sdk/util-endpoints": ["@aws-sdk/util-endpoints@3.828.0", "", { "dependencies": { "@aws-sdk/types": "3.821.0", "@smithy/types": "^4.3.1", "@smithy/util-endpoints": "^3.0.6", "tslib": "^2.6.2" } }, "sha512-RvKch111SblqdkPzg3oCIdlGxlQs+k+P7Etory9FmxPHyPDvsP1j1c74PmgYqtzzMWmoXTjd+c9naUHh9xG8xg=="], - - "@aws-sdk/util-locate-window": ["@aws-sdk/util-locate-window@3.804.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-zVoRfpmBVPodYlnMjgVjfGoEZagyRF5IPn3Uo6ZvOZp24chnW/FRstH7ESDHDDRga4z3V+ElUQHKpFDXWyBW5A=="], - - "@aws-sdk/util-user-agent-browser": ["@aws-sdk/util-user-agent-browser@3.821.0", "", { "dependencies": { "@aws-sdk/types": "3.821.0", "@smithy/types": "^4.3.1", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-irWZHyM0Jr1xhC+38OuZ7JB6OXMLPZlj48thElpsO1ZSLRkLZx5+I7VV6k3sp2yZ7BYbKz/G2ojSv4wdm7XTLw=="], - - "@aws-sdk/util-user-agent-node": ["@aws-sdk/util-user-agent-node@3.828.0", "", { "dependencies": { "@aws-sdk/middleware-user-agent": "3.828.0", "@aws-sdk/types": "3.821.0", "@smithy/node-config-provider": "^4.1.3", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "peerDependencies": { "aws-crt": ">=1.0.0" }, "optionalPeers": ["aws-crt"] }, "sha512-LdN6fTBzTlQmc8O8f1wiZN0qF3yBWVGis7NwpWK7FUEzP9bEZRxYfIkV9oV9zpt6iNRze1SedK3JQVB/udxBoA=="], - - "@aws-sdk/xml-builder": ["@aws-sdk/xml-builder@3.821.0", "", { "dependencies": { "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-DIIotRnefVL6DiaHtO6/21DhJ4JZnnIwdNbpwiAhdt/AVbttcE4yw925gsjur0OGv5BTYXQXU3YnANBYnZjuQA=="], - - "@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], - - "@babel/compat-data": ["@babel/compat-data@7.27.5", "", {}, "sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg=="], - - "@babel/core": ["@babel/core@7.27.4", "", { "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.27.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.27.3", "@babel/helpers": "^7.27.4", "@babel/parser": "^7.27.4", "@babel/template": "^7.27.2", "@babel/traverse": "^7.27.4", "@babel/types": "^7.27.3", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g=="], - - "@babel/generator": ["@babel/generator@7.27.5", "", { "dependencies": { "@babel/parser": "^7.27.5", "@babel/types": "^7.27.3", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" } }, "sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw=="], - - "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.27.2", "", { "dependencies": { "@babel/compat-data": "^7.27.2", "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ=="], - - "@babel/helper-module-imports": ["@babel/helper-module-imports@7.27.1", "", { "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" } }, "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w=="], - - "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.27.3", "", { "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1", "@babel/traverse": "^7.27.3" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg=="], - - "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.27.1", "", {}, "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw=="], - - "@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], - - "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.27.1", "", {}, "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow=="], - - "@babel/helper-validator-option": ["@babel/helper-validator-option@7.27.1", "", {}, "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg=="], - - "@babel/helpers": ["@babel/helpers@7.27.6", "", { "dependencies": { "@babel/template": "^7.27.2", "@babel/types": "^7.27.6" } }, "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug=="], - - "@babel/parser": ["@babel/parser@7.27.5", "", { "dependencies": { "@babel/types": "^7.27.3" }, "bin": "./bin/babel-parser.js" }, "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg=="], - - "@babel/plugin-transform-react-jsx-self": ["@babel/plugin-transform-react-jsx-self@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw=="], - - "@babel/plugin-transform-react-jsx-source": ["@babel/plugin-transform-react-jsx-source@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw=="], - - "@babel/runtime": ["@babel/runtime@7.27.6", "", {}, "sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q=="], - - "@babel/template": ["@babel/template@7.27.2", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/parser": "^7.27.2", "@babel/types": "^7.27.1" } }, "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw=="], - - "@babel/traverse": ["@babel/traverse@7.27.4", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.27.3", "@babel/parser": "^7.27.4", "@babel/template": "^7.27.2", "@babel/types": "^7.27.3", "debug": "^4.3.1", "globals": "^11.1.0" } }, "sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA=="], - - "@babel/types": ["@babel/types@7.27.6", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q=="], - - "@balena/dockerignore": ["@balena/dockerignore@1.0.2", "", {}, "sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q=="], - - "@emnapi/core": ["@emnapi/core@1.4.3", "", { "dependencies": { "@emnapi/wasi-threads": "1.0.2", "tslib": "^2.4.0" } }, "sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g=="], - - "@emnapi/runtime": ["@emnapi/runtime@1.4.3", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ=="], - - "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.0.2", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA=="], - - "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.5", "", { "os": "aix", "cpu": "ppc64" }, "sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA=="], - - "@esbuild/android-arm": ["@esbuild/android-arm@0.25.5", "", { "os": "android", "cpu": "arm" }, "sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA=="], - - "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.5", "", { "os": "android", "cpu": "arm64" }, "sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg=="], - - "@esbuild/android-x64": ["@esbuild/android-x64@0.25.5", "", { "os": "android", "cpu": "x64" }, "sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw=="], - - "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ=="], - - "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ=="], - - "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.5", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw=="], - - "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.5", "", { "os": "freebsd", "cpu": "x64" }, "sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw=="], - - "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.5", "", { "os": "linux", "cpu": "arm" }, "sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw=="], - - "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg=="], - - "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.5", "", { "os": "linux", "cpu": "ia32" }, "sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA=="], - - "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.5", "", { "os": "linux", "cpu": "none" }, "sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg=="], - - "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.5", "", { "os": "linux", "cpu": "none" }, "sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg=="], - - "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.5", "", { "os": "linux", "cpu": "ppc64" }, "sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ=="], - - "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.5", "", { "os": "linux", "cpu": "none" }, "sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA=="], - - "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.5", "", { "os": "linux", "cpu": "s390x" }, "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ=="], - - "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.5", "", { "os": "linux", "cpu": "x64" }, "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw=="], - - "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.5", "", { "os": "none", "cpu": "arm64" }, "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw=="], - - "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.5", "", { "os": "none", "cpu": "x64" }, "sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ=="], - - "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.5", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw=="], - - "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.5", "", { "os": "openbsd", "cpu": "x64" }, "sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg=="], - - "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.5", "", { "os": "sunos", "cpu": "x64" }, "sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA=="], - - "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw=="], - - "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ=="], - - "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.5", "", { "os": "win32", "cpu": "x64" }, "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g=="], - - "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.7.0", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw=="], - - "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.1", "", {}, "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ=="], - - "@eslint/config-array": ["@eslint/config-array@0.20.1", "", { "dependencies": { "@eslint/object-schema": "^2.1.6", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-OL0RJzC/CBzli0DrrR31qzj6d6i6Mm3HByuhflhl4LOBiWxN+3i6/t/ZQQNii4tjksXi8r2CRW1wMpWA2ULUEw=="], - - "@eslint/config-helpers": ["@eslint/config-helpers@0.2.3", "", {}, "sha512-u180qk2Um1le4yf0ruXH3PYFeEZeYC3p/4wCTKrr2U1CmGdzGi3KtY0nuPDH48UJxlKCC5RDzbcbh4X0XlqgHg=="], - - "@eslint/core": ["@eslint/core@0.14.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg=="], - - "@eslint/eslintrc": ["@eslint/eslintrc@3.3.1", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.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" } }, "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ=="], - - "@eslint/js": ["@eslint/js@9.29.0", "", {}, "sha512-3PIF4cBw/y+1u2EazflInpV+lYsSG0aByVIQzAgb1m1MhHFSbqTyNqtBKHgWf/9Ykud+DhILS9EGkmekVhbKoQ=="], - - "@eslint/object-schema": ["@eslint/object-schema@2.1.6", "", {}, "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA=="], - - "@eslint/plugin-kit": ["@eslint/plugin-kit@0.3.2", "", { "dependencies": { "@eslint/core": "^0.15.0", "levn": "^0.4.1" } }, "sha512-4SaFZCNfJqvk/kenHpI8xvN42DMaoycy4PzKc5otHxRswww1kAt82OlBuwRVLofCACCTZEcla2Ydxv8scMXaTg=="], - - "@fastify/busboy": ["@fastify/busboy@2.1.1", "", {}, "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA=="], - - "@grpc/grpc-js": ["@grpc/grpc-js@1.13.4", "", { "dependencies": { "@grpc/proto-loader": "^0.7.13", "@js-sdsl/ordered-map": "^4.4.2" } }, "sha512-GsFaMXCkMqkKIvwCQjCrwH+GHbPKBjhwo/8ZuUkWHqbI73Kky9I+pQltrlT0+MWpedCoosda53lgjYfyEPgxBg=="], - - "@grpc/proto-loader": ["@grpc/proto-loader@0.7.15", "", { "dependencies": { "lodash.camelcase": "^4.3.0", "long": "^5.0.0", "protobufjs": "^7.2.5", "yargs": "^17.7.2" }, "bin": { "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" } }, "sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ=="], - - "@hapi/boom": ["@hapi/boom@10.0.1", "", { "dependencies": { "@hapi/hoek": "^11.0.2" } }, "sha512-ERcCZaEjdH3OgSJlyjVk8pHIFeus91CjKP3v+MpgBNp5IvGzP2l/bRiD78nqYcKPaZdbKkK5vDBVPd2ohHBlsA=="], - - "@hapi/bourne": ["@hapi/bourne@3.0.0", "", {}, "sha512-Waj1cwPXJDucOib4a3bAISsKJVb15MKi9IvmTI/7ssVEm6sywXGjVJDhl6/umt1pK1ZS7PacXU3A1PmFKHEZ2w=="], - - "@hapi/hoek": ["@hapi/hoek@11.0.7", "", {}, "sha512-HV5undWkKzcB4RZUusqOpcgxOaq6VOAH7zhhIr2g3G8NF/MlFO75SjOr2NfuSx0Mh40+1FqCkagKLJRykUWoFQ=="], - - "@hapi/topo": ["@hapi/topo@5.1.0", "", { "dependencies": { "@hapi/hoek": "^9.0.0" } }, "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg=="], - - "@hapi/wreck": ["@hapi/wreck@18.1.0", "", { "dependencies": { "@hapi/boom": "^10.0.1", "@hapi/bourne": "^3.0.0", "@hapi/hoek": "^11.0.2" } }, "sha512-0z6ZRCmFEfV/MQqkQomJ7sl/hyxvcZM7LtuVqN3vdAO4vM9eBbowl0kaqQj9EJJQab+3Uuh1GxbGIBFy4NfJ4w=="], - - "@headlessui/react": ["@headlessui/react@1.7.19", "", { "dependencies": { "@tanstack/react-virtual": "^3.0.0-beta.60", "client-only": "^0.0.1" }, "peerDependencies": { "react": "^16 || ^17 || ^18", "react-dom": "^16 || ^17 || ^18" } }, "sha512-Ll+8q3OlMJfJbAKM/+/Y2q6PPYbryqNTXDbryx7SXLIDamkF6iQFbriYHga0dY44PvDhvvBWCx1Xj4U5+G4hOw=="], - - "@heroicons/react": ["@heroicons/react@2.2.0", "", { "peerDependencies": { "react": ">= 16 || ^19.0.0-rc" } }, "sha512-LMcepvRaS9LYHJGsF0zzmgKCUim/X3N/DQKc4jepAXJ7l8QxJ1PmxJzqplF2Z3FE4PqBAIGyJAQ/w4B5dsqbtQ=="], - - "@hookform/resolvers": ["@hookform/resolvers@3.10.0", "", { "peerDependencies": { "react-hook-form": "^7.0.0" } }, "sha512-79Dv+3mDF7i+2ajj7SkypSKHhl1cbln1OGavqrsF7p6mbUv11xpqpacPsGDCTRvCSjEEIez2ef1NveSVL3b0Ag=="], - - "@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="], - - "@humanfs/node": ["@humanfs/node@0.16.6", "", { "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.3.0" } }, "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw=="], - - "@humanwhocodes/config-array": ["@humanwhocodes/config-array@0.13.0", "", { "dependencies": { "@humanwhocodes/object-schema": "^2.0.3", "debug": "^4.3.1", "minimatch": "^3.0.5" } }, "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw=="], - - "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="], - - "@humanwhocodes/object-schema": ["@humanwhocodes/object-schema@2.0.3", "", {}, "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA=="], - - "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="], - - "@ianvs/prettier-plugin-sort-imports": ["@ianvs/prettier-plugin-sort-imports@4.4.2", "", { "dependencies": { "@babel/generator": "^7.26.2", "@babel/parser": "^7.26.2", "@babel/traverse": "^7.25.9", "@babel/types": "^7.26.0", "semver": "^7.5.2" }, "peerDependencies": { "@vue/compiler-sfc": "2.7.x || 3.x", "prettier": "2 || 3 || ^4.0.0-0" }, "optionalPeers": ["@vue/compiler-sfc"] }, "sha512-KkVFy3TLh0OFzimbZglMmORi+vL/i2OFhEs5M07R9w0IwWAGpsNNyE4CY/2u0YoMF5bawKC2+8/fUH60nnNtjw=="], - - "@ioredis/commands": ["@ioredis/commands@1.2.0", "", {}, "sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg=="], - - "@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="], - - "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.8", "", { "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA=="], - - "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], - - "@jridgewell/set-array": ["@jridgewell/set-array@1.2.1", "", {}, "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A=="], - - "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.0", "", {}, "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="], - - "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.25", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="], - - "@js-sdsl/ordered-map": ["@js-sdsl/ordered-map@4.4.2", "", {}, "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw=="], - - "@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.0.1", "", { "dependencies": { "content-type": "^1.0.5", "raw-body": "^3.0.0", "zod": "^3.23.8" } }, "sha512-slLdFaxQJ9AlRg+hw28iiTtGvShAOgOKXcD0F91nUcRYiOMuS9ZBYjcdNZRXW9G5JQ511GRTdUy1zQVZDpJ+4w=="], - - "@modelcontextprotocol/server-postgres": ["@modelcontextprotocol/server-postgres@0.6.2", "", { "dependencies": { "@modelcontextprotocol/sdk": "1.0.1", "pg": "^8.13.0" }, "bin": { "mcp-server-postgres": "dist/index.js" } }, "sha512-ukbVmVxLAsdZ5pTVWbhf9fc7lqkSf7XqizNH8XAotI21GnRPtkqO+WLWpeBFU+/2Fyv63uXS7/9NnR8Y8wOP1Q=="], - - "@mongodb-js/device-id": ["@mongodb-js/device-id@0.2.1", "", {}, "sha512-kC/F1/ryJMNeIt+n7CATAf9AL/X5Nz1Tju8VseyViL2DF640dmF/JQwWmjakpsSTy5X9TVNOkG9ye4Mber8GHQ=="], - - "@mongodb-js/devtools-connect": ["@mongodb-js/devtools-connect@3.8.2", "", { "dependencies": { "@mongodb-js/devtools-proxy-support": "^0.5.1", "@mongodb-js/oidc-http-server-pages": "1.1.6", "lodash.merge": "^4.6.2", "mongodb-connection-string-url": "^3.0.0", "socks": "^2.7.3" }, "optionalDependencies": { "kerberos": "^2.1.0", "mongodb-client-encryption": "^6.1.0", "os-dns-native": "^1.2.0", "resolve-mongodb-srv": "^1.1.1" }, "peerDependencies": { "@mongodb-js/oidc-plugin": "^1.1.0", "mongodb": "^6.9.0", "mongodb-log-writer": "^2.4.1" } }, "sha512-wiu3mg69q3hIrzB7c/QWiiJqqgVu76GfyYxw9h5MjUCuP6sEErYXoAHvZo1K75obnUX986i/GV9c/6oPLhxfkA=="], - - "@mongodb-js/devtools-proxy-support": ["@mongodb-js/devtools-proxy-support@0.5.1", "", { "dependencies": { "@mongodb-js/socksv5": "^0.0.10", "agent-base": "^7.1.1", "debug": "^4.4.0", "http-proxy-agent": "^7.0.2", "https-proxy-agent": "^7.0.5", "lru-cache": "^11.0.0", "node-fetch": "^3.3.2", "pac-proxy-agent": "^7.0.2", "socks-proxy-agent": "^8.0.4", "ssh2": "^1.15.0", "system-ca": "^2.0.1" } }, "sha512-snIekrl3yj6fPnk6UfTIrBj8Wt43hvjqf7XhGaw1Qcn55BOClE7FgXcJjLXOIDsEMuzdGtLnJji+GbW2uD2ulg=="], - - "@mongodb-js/oidc-http-server-pages": ["@mongodb-js/oidc-http-server-pages@1.1.6", "", {}, "sha512-ZR/IZi/jI81TRas5X9kzN9t2GZI6u9JdawKctdCoXCrtyvQmRU6ktviCcvXGLwjcZnIWEWbZM7bkpnEdITYSCw=="], - - "@mongodb-js/oidc-plugin": ["@mongodb-js/oidc-plugin@1.1.8", "", { "dependencies": { "express": "^4.18.2", "open": "^9.1.0", "openid-client": "^5.6.4" } }, "sha512-83H6SuUm4opxYqEc81AJBXEXlTMO9qnMGXidQFpB2Qwo4MmQtJN4UVm4notqwTBb/ysf410tspUGXy+QLu7xJQ=="], - - "@mongodb-js/saslprep": ["@mongodb-js/saslprep@1.3.0", "", { "dependencies": { "sparse-bitfield": "^3.0.3" } }, "sha512-zlayKCsIjYb7/IdfqxorK5+xUMyi4vOKcFy10wKJYc63NSdKI8mNME+uJqfatkPmOSMMUiojrL58IePKBm3gvQ=="], - - "@mongodb-js/socksv5": ["@mongodb-js/socksv5@0.0.10", "", { "dependencies": { "ip-address": "^9.0.5" } }, "sha512-JDz2fLKsjMiSNUxKrCpGptsgu7DzsXfu4gnUQ3RhUaBS1d4YbLrt6HejpckAiHIAa+niBpZAeiUsoop0IihWsw=="], - - "@mongosh/errors": ["@mongosh/errors@2.4.0", "", {}, "sha512-2YwY4TYlrAy3VC9Y5Xa1OWlbdb57O0ZTDfntROFcfotrMXkZc9CU+jafrKRNcPJz8UAhoUcSTDJuaLpC3AutHg=="], - - "@mongosh/service-provider-core": ["@mongosh/service-provider-core@3.3.3", "", { "dependencies": { "@aws-sdk/credential-providers": "^3.525.0", "@mongosh/errors": "2.4.0", "bson": "^6.10.3", "mongodb": "^6.16.0", "mongodb-build-info": "^1.7.2", "mongodb-connection-string-url": "^3.0.1" }, "optionalDependencies": { "mongodb-client-encryption": "^6.3.0" } }, "sha512-Cylm0JjY0iu2C91o3koGNDtx7WhhFhCo+zWSxD5+aFiuAxrQQEmVxqLGFB9QTHwUotsdk2i7zi2lMdYVtCnkCA=="], - - "@mongosh/service-provider-node-driver": ["@mongosh/service-provider-node-driver@3.10.2", "", { "dependencies": { "@mongodb-js/devtools-connect": "^3.4.1", "@mongodb-js/oidc-plugin": "^1.1.8", "@mongosh/errors": "2.4.0", "@mongosh/service-provider-core": "3.3.3", "@mongosh/types": "3.8.2", "aws4": "^1.12.0", "mongodb": "^6.16.0", "mongodb-connection-string-url": "^3.0.1", "socks": "^2.8.3" }, "optionalDependencies": { "kerberos": "2.1.0", "mongodb-client-encryption": "^6.3.0" } }, "sha512-mieBps75ru9pTb+4v9oVsB0Qectp0rlj581/fc2+Ae0Y40ajfsVosVI2IjazbCGzcauU5NXgoMh2tlJC3mTE+A=="], - - "@mongosh/types": ["@mongosh/types@3.8.2", "", { "dependencies": { "@mongodb-js/devtools-connect": "^3.4.1" } }, "sha512-p3GtgzfkaNNPrVyCnRG9zUn7X0J6o7CLAANlEmsCcQAIkKOF8QZlQ+PFy1GRrxmmyZd+EuTidNUZb73Qu5+4ZQ=="], - - "@msgpackr-extract/msgpackr-extract-darwin-arm64": ["@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw=="], - - "@msgpackr-extract/msgpackr-extract-darwin-x64": ["@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw=="], - - "@msgpackr-extract/msgpackr-extract-linux-arm": ["@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3", "", { "os": "linux", "cpu": "arm" }, "sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw=="], - - "@msgpackr-extract/msgpackr-extract-linux-arm64": ["@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg=="], - - "@msgpackr-extract/msgpackr-extract-linux-x64": ["@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3", "", { "os": "linux", "cpu": "x64" }, "sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg=="], - - "@msgpackr-extract/msgpackr-extract-win32-x64": ["@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3", "", { "os": "win32", "cpu": "x64" }, "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ=="], - - "@napi-rs/cli": ["@napi-rs/cli@2.18.4", "", { "bin": { "napi": "scripts/index.js" } }, "sha512-SgJeA4df9DE2iAEpr3M2H0OKl/yjtg1BnRI5/JyowS71tUWhrfSu2LT0V3vlHET+g1hBVlrO60PmEXwUEKp8Mg=="], - - "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@0.2.11", "", { "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@tybys/wasm-util": "^0.9.0" } }, "sha512-9DPkXtvHydrcOsopiYpUgPHpmj0HWZKMUnL2dZqpvC42lsratuBG06V5ipyno0fUek5VlFsNQ+AcFATSrJXgMA=="], - - "@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], - - "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], - - "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], - - "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], - - "@oxc-resolver/binding-darwin-arm64": ["@oxc-resolver/binding-darwin-arm64@11.2.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-ruKLkS+Dm/YIJaUhzEB7zPI+jh3EXxu0QnNV8I7t9jf0lpD2VnltuyRbhrbJEkksklZj//xCMyFFsILGjiU2Mg=="], - - "@oxc-resolver/binding-darwin-x64": ["@oxc-resolver/binding-darwin-x64@11.2.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-0zhgNUm5bYezdSFOg3FYhtVP83bAq7FTV/3suGQDl/43MixfQG7+bl+hlrP4mz6WlD2SUb2u9BomnJWl1uey9w=="], - - "@oxc-resolver/binding-freebsd-x64": ["@oxc-resolver/binding-freebsd-x64@11.2.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-SHOxfCcZV1axeIGfyeD1BkdLvfQgjmPy18tO0OUXGElcdScxD6MqU5rj/AVtiuBT+51GtFfOKlwl1+BdVwhD1A=="], - - "@oxc-resolver/binding-linux-arm-gnueabihf": ["@oxc-resolver/binding-linux-arm-gnueabihf@11.2.0", "", { "os": "linux", "cpu": "arm" }, "sha512-mgEkYrJ+N90sgEDqEZ07zH+4I1D28WjqAhdzfW3aS2x2vynVpoY9jWfHuH8S62vZt3uATJrTKTRa8CjPWEsrdw=="], - - "@oxc-resolver/binding-linux-arm64-gnu": ["@oxc-resolver/binding-linux-arm64-gnu@11.2.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-BhEzNLjn4HjP8+Q18D3/jeIDBxW7OgoJYIjw2CaaysnYneoTlij8hPTKxHfyqq4IGM3fFs9TLR/k338M3zkQ7g=="], - - "@oxc-resolver/binding-linux-arm64-musl": ["@oxc-resolver/binding-linux-arm64-musl@11.2.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-yxbMYUgRmN2V8x8XoxmD/Qq6aG7YIW3ToMDILfmcfeeRRVieEJ3DOWBT0JSE+YgrOy79OyFDH/1lO8VnqLmDQQ=="], - - "@oxc-resolver/binding-linux-riscv64-gnu": ["@oxc-resolver/binding-linux-riscv64-gnu@11.2.0", "", { "os": "linux", "cpu": "none" }, "sha512-QG1UfgC2N2qhW1tOnDCgB/26vn1RCshR5sYPhMeaxO1gMQ3kEKbZ3QyBXxrG1IX5qsXYj5hPDJLDYNYUjRcOpg=="], - - "@oxc-resolver/binding-linux-s390x-gnu": ["@oxc-resolver/binding-linux-s390x-gnu@11.2.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-uqTDsQdi6mrkSV1gvwbuT8jf/WFl6qVDVjNlx7IPSaAByrNiJfPrhTmH8b+Do58Dylz7QIRZgxQ8CHIZSyBUdg=="], - - "@oxc-resolver/binding-linux-x64-gnu": ["@oxc-resolver/binding-linux-x64-gnu@11.2.0", "", { "os": "linux", "cpu": "x64" }, "sha512-GZdHXhJ7p6GaQg9MjRqLebwBf8BLvGIagccI6z5yMj4fV3LU4QuDfwSEERG+R6oQ/Su9672MBqWwncvKcKT68w=="], - - "@oxc-resolver/binding-linux-x64-musl": ["@oxc-resolver/binding-linux-x64-musl@11.2.0", "", { "os": "linux", "cpu": "x64" }, "sha512-YBAC3GOicYznReG2twE7oFPSeK9Z1f507z1EYWKg6HpGYRYRlJyszViu7PrhMT85r/MumDTs429zm+CNqpFWOA=="], - - "@oxc-resolver/binding-wasm32-wasi": ["@oxc-resolver/binding-wasm32-wasi@11.2.0", "", { "dependencies": { "@napi-rs/wasm-runtime": "^0.2.11" }, "cpu": "none" }, "sha512-+qlIg45CPVPy+Jn3vqU1zkxA/AAv6e/2Ax/ImX8usZa8Tr2JmQn/93bmSOOOnr9fXRV9d0n4JyqYzSWxWPYDEw=="], - - "@oxc-resolver/binding-win32-arm64-msvc": ["@oxc-resolver/binding-win32-arm64-msvc@11.2.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-AI4KIpS8Zf6vwfOPk0uQPSC0pQ1m5HU4hCbtrgL21JgJSlnJaeEu3/aoOBB45AXKiExBU9R+CDR7aSnW7uhc5A=="], - - "@oxc-resolver/binding-win32-x64-msvc": ["@oxc-resolver/binding-win32-x64-msvc@11.2.0", "", { "os": "win32", "cpu": "x64" }, "sha512-r19cQc7HaEJ76HFsMsbiKMTIV2YqFGSof8H5hB7e5Jkb/23Y8Isv1YrSzkDaGhcw02I/COsrPo+eEmjy35eFuA=="], - - "@paralleldrive/cuid2": ["@paralleldrive/cuid2@2.2.2", "", { "dependencies": { "@noble/hashes": "^1.1.5" } }, "sha512-ZOBkgDwEdoYVlSeRbYYXs0S9MejQofiVYoTbKzy/6GQa39/q5tQU2IX46+shYnUkpEl3wc+J6wRlar7r2EK2xA=="], - - "@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="], - - "@protobufjs/aspromise": ["@protobufjs/aspromise@1.1.2", "", {}, "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="], - - "@protobufjs/base64": ["@protobufjs/base64@1.1.2", "", {}, "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="], - - "@protobufjs/codegen": ["@protobufjs/codegen@2.0.4", "", {}, "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg=="], - - "@protobufjs/eventemitter": ["@protobufjs/eventemitter@1.1.0", "", {}, "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q=="], - - "@protobufjs/fetch": ["@protobufjs/fetch@1.1.0", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.1", "@protobufjs/inquire": "^1.1.0" } }, "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ=="], - - "@protobufjs/float": ["@protobufjs/float@1.0.2", "", {}, "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ=="], - - "@protobufjs/inquire": ["@protobufjs/inquire@1.1.0", "", {}, "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q=="], - - "@protobufjs/path": ["@protobufjs/path@1.1.2", "", {}, "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA=="], - - "@protobufjs/pool": ["@protobufjs/pool@1.1.0", "", {}, "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw=="], - - "@protobufjs/utf8": ["@protobufjs/utf8@1.1.0", "", {}, "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="], - - "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-beta.11", "", {}, "sha512-L/gAA/hyCSuzTF1ftlzUSI/IKr2POHsv1Dd78GfqkR83KMNuswWD61JxGV2L7nRwBBBSDr6R1gCkdTmoN7W4ag=="], - - "@rtsao/scc": ["@rtsao/scc@1.1.0", "", {}, "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g=="], - - "@sec-ant/readable-stream": ["@sec-ant/readable-stream@0.4.1", "", {}, "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg=="], - - "@sideway/address": ["@sideway/address@4.1.5", "", { "dependencies": { "@hapi/hoek": "^9.0.0" } }, "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q=="], - - "@sideway/formula": ["@sideway/formula@3.0.1", "", {}, "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg=="], - - "@sideway/pinpoint": ["@sideway/pinpoint@2.0.0", "", {}, "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ=="], - - "@sindresorhus/is": ["@sindresorhus/is@7.0.2", "", {}, "sha512-d9xRovfKNz1SKieM0qJdO+PQonjnnIfSNWfHYnBSJ9hkjm0ZPw6HlxscDXYstp3z+7V2GOFHc+J0CYrYTjqCJw=="], - - "@smithy/abort-controller": ["@smithy/abort-controller@4.0.4", "", { "dependencies": { "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-gJnEjZMvigPDQWHrW3oPrFhQtkrgqBkyjj3pCIdF3A5M6vsZODG93KNlfJprv6bp4245bdT32fsHK4kkH3KYDA=="], - - "@smithy/config-resolver": ["@smithy/config-resolver@4.1.4", "", { "dependencies": { "@smithy/node-config-provider": "^4.1.3", "@smithy/types": "^4.3.1", "@smithy/util-config-provider": "^4.0.0", "@smithy/util-middleware": "^4.0.4", "tslib": "^2.6.2" } }, "sha512-prmU+rDddxHOH0oNcwemL+SwnzcG65sBF2yXRO7aeXIn/xTlq2pX7JLVbkBnVLowHLg4/OL4+jBmv9hVrVGS+w=="], - - "@smithy/core": ["@smithy/core@3.5.3", "", { "dependencies": { "@smithy/middleware-serde": "^4.0.8", "@smithy/protocol-http": "^5.1.2", "@smithy/types": "^4.3.1", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-middleware": "^4.0.4", "@smithy/util-stream": "^4.2.2", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-xa5byV9fEguZNofCclv6v9ra0FYh5FATQW/da7FQUVTic94DfrN/NvmKZjrMyzbpqfot9ZjBaO8U1UeTbmSLuA=="], - - "@smithy/credential-provider-imds": ["@smithy/credential-provider-imds@4.0.6", "", { "dependencies": { "@smithy/node-config-provider": "^4.1.3", "@smithy/property-provider": "^4.0.4", "@smithy/types": "^4.3.1", "@smithy/url-parser": "^4.0.4", "tslib": "^2.6.2" } }, "sha512-hKMWcANhUiNbCJouYkZ9V3+/Qf9pteR1dnwgdyzR09R4ODEYx8BbUysHwRSyex4rZ9zapddZhLFTnT4ZijR4pw=="], - - "@smithy/fetch-http-handler": ["@smithy/fetch-http-handler@5.0.4", "", { "dependencies": { "@smithy/protocol-http": "^5.1.2", "@smithy/querystring-builder": "^4.0.4", "@smithy/types": "^4.3.1", "@smithy/util-base64": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-AMtBR5pHppYMVD7z7G+OlHHAcgAN7v0kVKEpHuTO4Gb199Gowh0taYi9oDStFeUhetkeP55JLSVlTW1n9rFtUw=="], - - "@smithy/hash-node": ["@smithy/hash-node@4.0.4", "", { "dependencies": { "@smithy/types": "^4.3.1", "@smithy/util-buffer-from": "^4.0.0", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-qnbTPUhCVnCgBp4z4BUJUhOEkVwxiEi1cyFM+Zj6o+aY8OFGxUQleKWq8ltgp3dujuhXojIvJWdoqpm6dVO3lQ=="], - - "@smithy/invalid-dependency": ["@smithy/invalid-dependency@4.0.4", "", { "dependencies": { "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-bNYMi7WKTJHu0gn26wg8OscncTt1t2b8KcsZxvOv56XA6cyXtOAAAaNP7+m45xfppXfOatXF3Sb1MNsLUgVLTw=="], - - "@smithy/is-array-buffer": ["@smithy/is-array-buffer@4.0.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw=="], - - "@smithy/middleware-content-length": ["@smithy/middleware-content-length@4.0.4", "", { "dependencies": { "@smithy/protocol-http": "^5.1.2", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-F7gDyfI2BB1Kc+4M6rpuOLne5LOcEknH1n6UQB69qv+HucXBR1rkzXBnQTB2q46sFy1PM/zuSJOB532yc8bg3w=="], - - "@smithy/middleware-endpoint": ["@smithy/middleware-endpoint@4.1.11", "", { "dependencies": { "@smithy/core": "^3.5.3", "@smithy/middleware-serde": "^4.0.8", "@smithy/node-config-provider": "^4.1.3", "@smithy/shared-ini-file-loader": "^4.0.4", "@smithy/types": "^4.3.1", "@smithy/url-parser": "^4.0.4", "@smithy/util-middleware": "^4.0.4", "tslib": "^2.6.2" } }, "sha512-zDogwtRLzKl58lVS8wPcARevFZNBOOqnmzWWxVe9XiaXU2CADFjvJ9XfNibgkOWs08sxLuSr81NrpY4mgp9OwQ=="], - - "@smithy/middleware-retry": ["@smithy/middleware-retry@4.1.12", "", { "dependencies": { "@smithy/node-config-provider": "^4.1.3", "@smithy/protocol-http": "^5.1.2", "@smithy/service-error-classification": "^4.0.5", "@smithy/smithy-client": "^4.4.3", "@smithy/types": "^4.3.1", "@smithy/util-middleware": "^4.0.4", "@smithy/util-retry": "^4.0.5", "tslib": "^2.6.2", "uuid": "^9.0.1" } }, "sha512-wvIH70c4e91NtRxdaLZF+mbLZ/HcC6yg7ySKUiufL6ESp6zJUSnJucZ309AvG9nqCFHSRB5I6T3Ez1Q9wCh0Ww=="], - - "@smithy/middleware-serde": ["@smithy/middleware-serde@4.0.8", "", { "dependencies": { "@smithy/protocol-http": "^5.1.2", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-iSSl7HJoJaGyMIoNn2B7czghOVwJ9nD7TMvLhMWeSB5vt0TnEYyRRqPJu/TqW76WScaNvYYB8nRoiBHR9S1Ddw=="], - - "@smithy/middleware-stack": ["@smithy/middleware-stack@4.0.4", "", { "dependencies": { "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-kagK5ggDrBUCCzI93ft6DjteNSfY8Ulr83UtySog/h09lTIOAJ/xUSObutanlPT0nhoHAkpmW9V5K8oPyLh+QA=="], - - "@smithy/node-config-provider": ["@smithy/node-config-provider@4.1.3", "", { "dependencies": { "@smithy/property-provider": "^4.0.4", "@smithy/shared-ini-file-loader": "^4.0.4", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw=="], - - "@smithy/node-http-handler": ["@smithy/node-http-handler@4.0.6", "", { "dependencies": { "@smithy/abort-controller": "^4.0.4", "@smithy/protocol-http": "^5.1.2", "@smithy/querystring-builder": "^4.0.4", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-NqbmSz7AW2rvw4kXhKGrYTiJVDHnMsFnX4i+/FzcZAfbOBauPYs2ekuECkSbtqaxETLLTu9Rl/ex6+I2BKErPA=="], - - "@smithy/property-provider": ["@smithy/property-provider@4.0.4", "", { "dependencies": { "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw=="], - - "@smithy/protocol-http": ["@smithy/protocol-http@5.1.2", "", { "dependencies": { "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-rOG5cNLBXovxIrICSBm95dLqzfvxjEmuZx4KK3hWwPFHGdW3lxY0fZNXfv2zebfRO7sJZ5pKJYHScsqopeIWtQ=="], - - "@smithy/querystring-builder": ["@smithy/querystring-builder@4.0.4", "", { "dependencies": { "@smithy/types": "^4.3.1", "@smithy/util-uri-escape": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-SwREZcDnEYoh9tLNgMbpop+UTGq44Hl9tdj3rf+yeLcfH7+J8OXEBaMc2kDxtyRHu8BhSg9ADEx0gFHvpJgU8w=="], - - "@smithy/querystring-parser": ["@smithy/querystring-parser@4.0.4", "", { "dependencies": { "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-6yZf53i/qB8gRHH/l2ZwUG5xgkPgQF15/KxH0DdXMDHjesA9MeZje/853ifkSY0x4m5S+dfDZ+c4x439PF0M2w=="], - - "@smithy/service-error-classification": ["@smithy/service-error-classification@4.0.5", "", { "dependencies": { "@smithy/types": "^4.3.1" } }, "sha512-LvcfhrnCBvCmTee81pRlh1F39yTS/+kYleVeLCwNtkY8wtGg8V/ca9rbZZvYIl8OjlMtL6KIjaiL/lgVqHD2nA=="], - - "@smithy/shared-ini-file-loader": ["@smithy/shared-ini-file-loader@4.0.4", "", { "dependencies": { "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw=="], - - "@smithy/signature-v4": ["@smithy/signature-v4@5.1.2", "", { "dependencies": { "@smithy/is-array-buffer": "^4.0.0", "@smithy/protocol-http": "^5.1.2", "@smithy/types": "^4.3.1", "@smithy/util-hex-encoding": "^4.0.0", "@smithy/util-middleware": "^4.0.4", "@smithy/util-uri-escape": "^4.0.0", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-d3+U/VpX7a60seHziWnVZOHuEgJlclufjkS6zhXvxcJgkJq4UWdH5eOBLzHRMx6gXjsdT9h6lfpmLzbrdupHgQ=="], - - "@smithy/smithy-client": ["@smithy/smithy-client@4.4.3", "", { "dependencies": { "@smithy/core": "^3.5.3", "@smithy/middleware-endpoint": "^4.1.11", "@smithy/middleware-stack": "^4.0.4", "@smithy/protocol-http": "^5.1.2", "@smithy/types": "^4.3.1", "@smithy/util-stream": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-xxzNYgA0HD6ETCe5QJubsxP0hQH3QK3kbpJz3QrosBCuIWyEXLR/CO5hFb2OeawEKUxMNhz3a1nuJNN2np2RMA=="], - - "@smithy/types": ["@smithy/types@4.3.1", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA=="], - - "@smithy/url-parser": ["@smithy/url-parser@4.0.4", "", { "dependencies": { "@smithy/querystring-parser": "^4.0.4", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-eMkc144MuN7B0TDA4U2fKs+BqczVbk3W+qIvcoCY6D1JY3hnAdCuhCZODC+GAeaxj0p6Jroz4+XMUn3PCxQQeQ=="], - - "@smithy/util-base64": ["@smithy/util-base64@4.0.0", "", { "dependencies": { "@smithy/util-buffer-from": "^4.0.0", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg=="], - - "@smithy/util-body-length-browser": ["@smithy/util-body-length-browser@4.0.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA=="], - - "@smithy/util-body-length-node": ["@smithy/util-body-length-node@4.0.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg=="], - - "@smithy/util-buffer-from": ["@smithy/util-buffer-from@4.0.0", "", { "dependencies": { "@smithy/is-array-buffer": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug=="], - - "@smithy/util-config-provider": ["@smithy/util-config-provider@4.0.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w=="], - - "@smithy/util-defaults-mode-browser": ["@smithy/util-defaults-mode-browser@4.0.19", "", { "dependencies": { "@smithy/property-provider": "^4.0.4", "@smithy/smithy-client": "^4.4.3", "@smithy/types": "^4.3.1", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-mvLMh87xSmQrV5XqnUYEPoiFFeEGYeAKIDDKdhE2ahqitm8OHM3aSvhqL6rrK6wm1brIk90JhxDf5lf2hbrLbQ=="], - - "@smithy/util-defaults-mode-node": ["@smithy/util-defaults-mode-node@4.0.19", "", { "dependencies": { "@smithy/config-resolver": "^4.1.4", "@smithy/credential-provider-imds": "^4.0.6", "@smithy/node-config-provider": "^4.1.3", "@smithy/property-provider": "^4.0.4", "@smithy/smithy-client": "^4.4.3", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-8tYnx+LUfj6m+zkUUIrIQJxPM1xVxfRBvoGHua7R/i6qAxOMjqR6CpEpDwKoIs1o0+hOjGvkKE23CafKL0vJ9w=="], - - "@smithy/util-endpoints": ["@smithy/util-endpoints@3.0.6", "", { "dependencies": { "@smithy/node-config-provider": "^4.1.3", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-YARl3tFL3WgPuLzljRUnrS2ngLiUtkwhQtj8PAL13XZSyUiNLQxwG3fBBq3QXFqGFUXepIN73pINp3y8c2nBmA=="], - - "@smithy/util-hex-encoding": ["@smithy/util-hex-encoding@4.0.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw=="], - - "@smithy/util-middleware": ["@smithy/util-middleware@4.0.4", "", { "dependencies": { "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-9MLKmkBmf4PRb0ONJikCbCwORACcil6gUWojwARCClT7RmLzF04hUR4WdRprIXal7XVyrddadYNfp2eF3nrvtQ=="], - - "@smithy/util-retry": ["@smithy/util-retry@4.0.5", "", { "dependencies": { "@smithy/service-error-classification": "^4.0.5", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-V7MSjVDTlEt/plmOFBn1762Dyu5uqMrV2Pl2X0dYk4XvWfdWJNe9Bs5Bzb56wkCuiWjSfClVMGcsuKrGj7S/yg=="], - - "@smithy/util-stream": ["@smithy/util-stream@4.2.2", "", { "dependencies": { "@smithy/fetch-http-handler": "^5.0.4", "@smithy/node-http-handler": "^4.0.6", "@smithy/types": "^4.3.1", "@smithy/util-base64": "^4.0.0", "@smithy/util-buffer-from": "^4.0.0", "@smithy/util-hex-encoding": "^4.0.0", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-aI+GLi7MJoVxg24/3J1ipwLoYzgkB4kUfogZfnslcYlynj3xsQ0e7vk4TnTro9hhsS5PvX1mwmkRqqHQjwcU7w=="], - - "@smithy/util-uri-escape": ["@smithy/util-uri-escape@4.0.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg=="], - - "@smithy/util-utf8": ["@smithy/util-utf8@4.0.0", "", { "dependencies": { "@smithy/util-buffer-from": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow=="], - - "@socket.io/component-emitter": ["@socket.io/component-emitter@3.1.2", "", {}, "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA=="], - - "@stock-bot/browser": ["@stock-bot/browser@workspace:libs/services/browser"], - - "@stock-bot/cache": ["@stock-bot/cache@workspace:libs/core/cache"], - - "@stock-bot/config": ["@stock-bot/config@workspace:libs/core/config"], - - "@stock-bot/core": ["@stock-bot/core@workspace:apps/stock/core"], - - "@stock-bot/coverage-cli": ["@stock-bot/coverage-cli@workspace:tools/coverage-cli"], - - "@stock-bot/data-ingestion": ["@stock-bot/data-ingestion@workspace:apps/stock/data-ingestion"], - - "@stock-bot/data-pipeline": ["@stock-bot/data-pipeline@workspace:apps/stock/data-pipeline"], - - "@stock-bot/di": ["@stock-bot/di@workspace:libs/core/di"], - - "@stock-bot/event-bus": ["@stock-bot/event-bus@workspace:libs/core/event-bus"], - - "@stock-bot/handler-registry": ["@stock-bot/handler-registry@workspace:libs/core/handler-registry"], - - "@stock-bot/handlers": ["@stock-bot/handlers@workspace:libs/core/handlers"], - - "@stock-bot/logger": ["@stock-bot/logger@workspace:libs/core/logger"], - - "@stock-bot/mongodb": ["@stock-bot/mongodb@workspace:libs/data/mongodb"], - - "@stock-bot/orchestrator": ["@stock-bot/orchestrator@workspace:apps/stock/orchestrator"], - - "@stock-bot/postgres": ["@stock-bot/postgres@workspace:libs/data/postgres"], - - "@stock-bot/proxy": ["@stock-bot/proxy@workspace:libs/services/proxy"], - - "@stock-bot/questdb": ["@stock-bot/questdb@workspace:libs/data/questdb"], - - "@stock-bot/queue": ["@stock-bot/queue@workspace:libs/core/queue"], - - "@stock-bot/shutdown": ["@stock-bot/shutdown@workspace:libs/core/shutdown"], - - "@stock-bot/stock-app": ["@stock-bot/stock-app@workspace:apps/stock"], - - "@stock-bot/stock-config": ["@stock-bot/stock-config@workspace:apps/stock/config"], - - "@stock-bot/types": ["@stock-bot/types@workspace:libs/core/types"], - - "@stock-bot/utils": ["@stock-bot/utils@workspace:libs/utils"], - - "@stock-bot/web-api": ["@stock-bot/web-api@workspace:apps/stock/web-api"], - - "@stock-bot/web-app": ["@stock-bot/web-app@workspace:apps/stock/web-app"], - - "@szmarczak/http-timer": ["@szmarczak/http-timer@5.0.1", "", { "dependencies": { "defer-to-connect": "^2.0.1" } }, "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw=="], - - "@tanstack/react-table": ["@tanstack/react-table@8.21.3", "", { "dependencies": { "@tanstack/table-core": "8.21.3" }, "peerDependencies": { "react": ">=16.8", "react-dom": ">=16.8" } }, "sha512-5nNMTSETP4ykGegmVkhjcS8tTLW6Vl4axfEGQN3v0zdHYbK4UfoqfPChclTrJ4EoK9QynqAu9oUf8VEmrpZ5Ww=="], - - "@tanstack/react-virtual": ["@tanstack/react-virtual@3.13.10", "", { "dependencies": { "@tanstack/virtual-core": "3.13.10" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-nvrzk4E9mWB4124YdJ7/yzwou7IfHxlSef6ugCFcBfRmsnsma3heciiiV97sBNxyc3VuwtZvmwXd0aB5BpucVw=="], - - "@tanstack/table-core": ["@tanstack/table-core@8.21.3", "", {}, "sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg=="], - - "@tanstack/virtual-core": ["@tanstack/virtual-core@3.13.10", "", {}, "sha512-sPEDhXREou5HyZYqSWIqdU580rsF6FGeN7vpzijmP3KTiOGjOMZASz4Y6+QKjiFQwhWrR58OP8izYaNGVxvViA=="], - - "@testcontainers/mongodb": ["@testcontainers/mongodb@10.28.0", "", { "dependencies": { "testcontainers": "^10.28.0" } }, "sha512-78h6n2jnFOQ8IfPjgL1+vsHuEeA0itclEOpx9kkQR+FOWnwJN9AeeX6+rMmZCtRgTsr5wT0BvfFoDssMkDqWaQ=="], - - "@testcontainers/postgresql": ["@testcontainers/postgresql@10.28.0", "", { "dependencies": { "testcontainers": "^10.28.0" } }, "sha512-NN25rruG5D4Q7pCNIJuHwB+G85OSeJ3xHZ2fWx0O6sPoPEfCYwvpj8mq99cyn68nxFkFYZeyrZJtSFO+FnydiA=="], - - "@tootallnate/quickjs-emscripten": ["@tootallnate/quickjs-emscripten@0.23.0", "", {}, "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA=="], - - "@tybys/wasm-util": ["@tybys/wasm-util@0.9.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw=="], - - "@types/babel__core": ["@types/babel__core@7.20.5", "", { "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="], - - "@types/babel__generator": ["@types/babel__generator@7.27.0", "", { "dependencies": { "@babel/types": "^7.0.0" } }, "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg=="], - - "@types/babel__template": ["@types/babel__template@7.4.4", "", { "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A=="], - - "@types/babel__traverse": ["@types/babel__traverse@7.20.7", "", { "dependencies": { "@babel/types": "^7.20.7" } }, "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng=="], - - "@types/bun": ["@types/bun@1.2.17", "", { "dependencies": { "bun-types": "1.2.17" } }, "sha512-l/BYs/JYt+cXA/0+wUhulYJB6a6p//GTPiJ7nV+QHa8iiId4HZmnu/3J/SowP5g0rTiERY2kfGKXEK5Ehltx4Q=="], - - "@types/cookiejar": ["@types/cookiejar@2.1.5", "", {}, "sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q=="], - - "@types/cors": ["@types/cors@2.8.19", "", { "dependencies": { "@types/node": "*" } }, "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg=="], - - "@types/d3-array": ["@types/d3-array@3.2.1", "", {}, "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg=="], - - "@types/d3-color": ["@types/d3-color@3.1.3", "", {}, "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A=="], - - "@types/d3-ease": ["@types/d3-ease@3.0.2", "", {}, "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA=="], - - "@types/d3-interpolate": ["@types/d3-interpolate@3.0.4", "", { "dependencies": { "@types/d3-color": "*" } }, "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA=="], - - "@types/d3-path": ["@types/d3-path@3.1.1", "", {}, "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg=="], - - "@types/d3-scale": ["@types/d3-scale@4.0.9", "", { "dependencies": { "@types/d3-time": "*" } }, "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw=="], - - "@types/d3-shape": ["@types/d3-shape@3.1.7", "", { "dependencies": { "@types/d3-path": "*" } }, "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg=="], - - "@types/d3-time": ["@types/d3-time@3.0.4", "", {}, "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g=="], - - "@types/d3-timer": ["@types/d3-timer@3.0.2", "", {}, "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw=="], - - "@types/docker-modem": ["@types/docker-modem@3.0.6", "", { "dependencies": { "@types/node": "*", "@types/ssh2": "*" } }, "sha512-yKpAGEuKRSS8wwx0joknWxsmLha78wNMe9R2S3UNsVOkZded8UqOrV8KoeDXoXsjndxwyF3eIhyClGbO1SEhEg=="], - - "@types/dockerode": ["@types/dockerode@3.3.41", "", { "dependencies": { "@types/docker-modem": "*", "@types/node": "*", "@types/ssh2": "*" } }, "sha512-5kOi6bcnEjqfJ68ZNV/bBvSMLNIucc0XbRmBO4hg5OoFCoP99eSRcbMysjkzV7ZxQEmmc/zMnv4A7odwuKFzDA=="], - - "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], - - "@types/glob": ["@types/glob@8.1.0", "", { "dependencies": { "@types/minimatch": "^5.1.2", "@types/node": "*" } }, "sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w=="], - - "@types/http-cache-semantics": ["@types/http-cache-semantics@4.0.4", "", {}, "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA=="], - - "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], - - "@types/json5": ["@types/json5@0.0.29", "", {}, "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ=="], - - "@types/lcov-parse": ["@types/lcov-parse@1.0.2", "", {}, "sha512-tdoxiYm04XdDEdR7UMwkWj78UAVo9U2IOcxI6tmX2/s9TK/ue/9T8gbpS/07yeWyVkVO0UumFQ5EUIBQbVejzQ=="], - - "@types/methods": ["@types/methods@1.1.4", "", {}, "sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ=="], - - "@types/minimatch": ["@types/minimatch@5.1.2", "", {}, "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA=="], - - "@types/mongodb": ["@types/mongodb@4.0.7", "", { "dependencies": { "mongodb": "*" } }, "sha512-lPUYPpzA43baXqnd36cZ9xxorprybxXDzteVKCPAdp14ppHtFJHnXYvNpmBvtMUTb5fKXVv6sVbzo1LHkWhJlw=="], - - "@types/node": ["@types/node@20.19.1", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-jJD50LtlD2dodAEO653i3YF04NWak6jN3ky+Ri3Em3mGR39/glWiboM/IePaRbgwSfqM1TpGXfAg8ohn/4dTgA=="], - - "@types/pg": ["@types/pg@8.15.4", "", { "dependencies": { "@types/node": "*", "pg-protocol": "*", "pg-types": "^2.2.0" } }, "sha512-I6UNVBAoYbvuWkkU3oosC8yxqH21f4/Jc4DK71JLG3dT2mdlGe1z+ep/LQGXaKaOgcvUrsQoPRqfgtMcvZiJhg=="], - - "@types/prop-types": ["@types/prop-types@15.7.15", "", {}, "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw=="], - - "@types/react": ["@types/react@18.3.23", "", { "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" } }, "sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w=="], - - "@types/react-dom": ["@types/react-dom@18.3.7", "", { "peerDependencies": { "@types/react": "^18.0.0" } }, "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ=="], - - "@types/semver": ["@types/semver@7.7.0", "", {}, "sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA=="], - - "@types/ssh2": ["@types/ssh2@0.5.52", "", { "dependencies": { "@types/node": "*", "@types/ssh2-streams": "*" } }, "sha512-lbLLlXxdCZOSJMCInKH2+9V/77ET2J6NPQHpFI0kda61Dd1KglJs+fPQBchizmzYSOJBgdTajhPqBO1xxLywvg=="], - - "@types/ssh2-streams": ["@types/ssh2-streams@0.1.12", "", { "dependencies": { "@types/node": "*" } }, "sha512-Sy8tpEmCce4Tq0oSOYdfqaBpA3hDM8SoxoFh5vzFsu2oL+znzGz8oVWW7xb4K920yYMUY+PIG31qZnFMfPWNCg=="], - - "@types/superagent": ["@types/superagent@8.1.9", "", { "dependencies": { "@types/cookiejar": "^2.1.5", "@types/methods": "^1.1.4", "@types/node": "*", "form-data": "^4.0.0" } }, "sha512-pTVjI73witn+9ILmoJdajHGW2jkSaOzhiFYF1Rd3EQ94kymLqB9PjD9ISg7WaALC7+dCHT0FGe9T2LktLq/3GQ=="], - - "@types/supertest": ["@types/supertest@6.0.3", "", { "dependencies": { "@types/methods": "^1.1.4", "@types/superagent": "^8.1.0" } }, "sha512-8WzXq62EXFhJ7QsH3Ocb/iKQ/Ty9ZVWnVzoTKc9tyyFRRF3a74Tk2+TLFgaFFw364Ere+npzHKEJ6ga2LzIL7w=="], - - "@types/webidl-conversions": ["@types/webidl-conversions@7.0.3", "", {}, "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA=="], - - "@types/whatwg-url": ["@types/whatwg-url@11.0.5", "", { "dependencies": { "@types/webidl-conversions": "*" } }, "sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ=="], - - "@types/yup": ["@types/yup@0.32.0", "", { "dependencies": { "yup": "*" } }, "sha512-Gr2lllWTDxGVYHgWfL8szjdedERpNgm44L9BDL2cmcHG7Bfd6taEpiW3ayMFLaYvlJr/6bFXDJdh6L406AGlFg=="], - - "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.34.1", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.34.1", "@typescript-eslint/type-utils": "8.34.1", "@typescript-eslint/utils": "8.34.1", "@typescript-eslint/visitor-keys": "8.34.1", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.34.1", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-STXcN6ebF6li4PxwNeFnqF8/2BNDvBupf2OPx2yWNzr6mKNGF7q49VM00Pz5FaomJyqvbXpY6PhO+T9w139YEQ=="], - - "@typescript-eslint/parser": ["@typescript-eslint/parser@8.34.1", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.34.1", "@typescript-eslint/types": "8.34.1", "@typescript-eslint/typescript-estree": "8.34.1", "@typescript-eslint/visitor-keys": "8.34.1", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-4O3idHxhyzjClSMJ0a29AcoK0+YwnEqzI6oz3vlRf3xw0zbzt15MzXwItOlnr5nIth6zlY2RENLsOPvhyrKAQA=="], - - "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.34.1", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.34.1", "@typescript-eslint/types": "^8.34.1", "debug": "^4.3.4" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-nuHlOmFZfuRwLJKDGQOVc0xnQrAmuq1Mj/ISou5044y1ajGNp2BNliIqp7F2LPQ5sForz8lempMFCovfeS1XoA=="], - - "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.34.1", "", { "dependencies": { "@typescript-eslint/types": "8.34.1", "@typescript-eslint/visitor-keys": "8.34.1" } }, "sha512-beu6o6QY4hJAgL1E8RaXNC071G4Kso2MGmJskCFQhRhg8VOH/FDbC8soP8NHN7e/Hdphwp8G8cE6OBzC8o41ZA=="], - - "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.34.1", "", { "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-K4Sjdo4/xF9NEeA2khOb7Y5nY6NSXBnod87uniVYW9kHP+hNlDV8trUSFeynA2uxWam4gIWgWoygPrv9VMWrYg=="], - - "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.34.1", "", { "dependencies": { "@typescript-eslint/typescript-estree": "8.34.1", "@typescript-eslint/utils": "8.34.1", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-Tv7tCCr6e5m8hP4+xFugcrwTOucB8lshffJ6zf1mF1TbU67R+ntCc6DzLNKM+s/uzDyv8gLq7tufaAhIBYeV8g=="], - - "@typescript-eslint/types": ["@typescript-eslint/types@8.34.1", "", {}, "sha512-rjLVbmE7HR18kDsjNIZQHxmv9RZwlgzavryL5Lnj2ujIRTeXlKtILHgRNmQ3j4daw7zd+mQgy+uyt6Zo6I0IGA=="], - - "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.34.1", "", { "dependencies": { "@typescript-eslint/project-service": "8.34.1", "@typescript-eslint/tsconfig-utils": "8.34.1", "@typescript-eslint/types": "8.34.1", "@typescript-eslint/visitor-keys": "8.34.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-rjCNqqYPuMUF5ODD+hWBNmOitjBWghkGKJg6hiCHzUvXRy6rK22Jd3rwbP2Xi+R7oYVvIKhokHVhH41BxPV5mA=="], - - "@typescript-eslint/utils": ["@typescript-eslint/utils@8.34.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.34.1", "@typescript-eslint/types": "8.34.1", "@typescript-eslint/typescript-estree": "8.34.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-mqOwUdZ3KjtGk7xJJnLbHxTuWVn3GO2WZZuM+Slhkun4+qthLdXx32C8xIXbO1kfCECb3jIs3eoxK3eryk7aoQ=="], - - "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.34.1", "", { "dependencies": { "@typescript-eslint/types": "8.34.1", "eslint-visitor-keys": "^4.2.1" } }, "sha512-xoh5rJ+tgsRKoXnkBPFRLZ7rjKM0AfVbC68UZ/ECXoDbfggb9RbEySN359acY1vS3qZ0jVTVWzbtfapwm5ztxw=="], - - "@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="], - - "@vitejs/plugin-react": ["@vitejs/plugin-react@4.5.2", "", { "dependencies": { "@babel/core": "^7.27.4", "@babel/plugin-transform-react-jsx-self": "^7.27.1", "@babel/plugin-transform-react-jsx-source": "^7.27.1", "@rolldown/pluginutils": "1.0.0-beta.11", "@types/babel__core": "^7.20.5", "react-refresh": "^0.17.0" }, "peerDependencies": { "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" } }, "sha512-QNVT3/Lxx99nMQWJWF7K4N6apUEuT0KlZA3mx/mVaoGj3smm/8rc8ezz15J1pcbcjDK0V15rpHetVfya08r76Q=="], - - "abort-controller": ["abort-controller@3.0.0", "", { "dependencies": { "event-target-shim": "^5.0.0" } }, "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg=="], - - "accepts": ["accepts@1.3.8", "", { "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" } }, "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw=="], - - "acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="], - - "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], - - "agent-base": ["agent-base@7.1.3", "", {}, "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw=="], - - "ajv": ["ajv@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" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], - - "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - - "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], - - "any-promise": ["any-promise@1.3.0", "", {}, "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A=="], - - "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="], - - "archiver": ["archiver@7.0.1", "", { "dependencies": { "archiver-utils": "^5.0.2", "async": "^3.2.4", "buffer-crc32": "^1.0.0", "readable-stream": "^4.0.0", "readdir-glob": "^1.1.2", "tar-stream": "^3.0.0", "zip-stream": "^6.0.1" } }, "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ=="], - - "archiver-utils": ["archiver-utils@5.0.2", "", { "dependencies": { "glob": "^10.0.0", "graceful-fs": "^4.2.0", "is-stream": "^2.0.1", "lazystream": "^1.0.0", "lodash": "^4.17.15", "normalize-path": "^3.0.0", "readable-stream": "^4.0.0" } }, "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA=="], - - "arg": ["arg@5.0.2", "", {}, "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg=="], - - "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], - - "array-buffer-byte-length": ["array-buffer-byte-length@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "is-array-buffer": "^3.0.5" } }, "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw=="], - - "array-flatten": ["array-flatten@1.1.1", "", {}, "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="], - - "array-includes": ["array-includes@3.1.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-abstract": "^1.24.0", "es-object-atoms": "^1.1.1", "get-intrinsic": "^1.3.0", "is-string": "^1.1.1", "math-intrinsics": "^1.1.0" } }, "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ=="], - - "array-union": ["array-union@2.1.0", "", {}, "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="], - - "array.prototype.findlast": ["array.prototype.findlast@1.2.5", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "es-shim-unscopables": "^1.0.2" } }, "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ=="], - - "array.prototype.findlastindex": ["array.prototype.findlastindex@1.2.6", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-abstract": "^1.23.9", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "es-shim-unscopables": "^1.1.0" } }, "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ=="], - - "array.prototype.flat": ["array.prototype.flat@1.3.3", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-shim-unscopables": "^1.0.2" } }, "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg=="], - - "array.prototype.flatmap": ["array.prototype.flatmap@1.3.3", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-shim-unscopables": "^1.0.2" } }, "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg=="], - - "array.prototype.tosorted": ["array.prototype.tosorted@1.1.4", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.3", "es-errors": "^1.3.0", "es-shim-unscopables": "^1.0.2" } }, "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA=="], - - "arraybuffer.prototype.slice": ["arraybuffer.prototype.slice@1.0.4", "", { "dependencies": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "is-array-buffer": "^3.0.4" } }, "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ=="], - - "asap": ["asap@2.0.6", "", {}, "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA=="], - - "asn1": ["asn1@0.2.6", "", { "dependencies": { "safer-buffer": "~2.1.0" } }, "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ=="], - - "ast-types": ["ast-types@0.13.4", "", { "dependencies": { "tslib": "^2.0.1" } }, "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w=="], - - "astral-regex": ["astral-regex@2.0.0", "", {}, "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ=="], - - "async": ["async@3.2.6", "", {}, "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA=="], - - "async-function": ["async-function@1.0.0", "", {}, "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA=="], - - "async-lock": ["async-lock@1.4.1", "", {}, "sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ=="], - - "async-mutex": ["async-mutex@0.4.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-WfoBo4E/TbCX1G95XTjbWTE3X2XLG0m1Xbv2cwOtuPdyH9CZvnaA5nCt1ucjaKEgW2A5IF71hxrRhr83Je5xjA=="], - - "asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="], - - "atomic-sleep": ["atomic-sleep@1.0.0", "", {}, "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ=="], - - "autoprefixer": ["autoprefixer@10.4.21", "", { "dependencies": { "browserslist": "^4.24.4", "caniuse-lite": "^1.0.30001702", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.1.0" }, "bin": { "autoprefixer": "bin/autoprefixer" } }, "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ=="], - - "available-typed-arrays": ["available-typed-arrays@1.0.7", "", { "dependencies": { "possible-typed-array-names": "^1.0.0" } }, "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ=="], - - "awilix": ["awilix@12.0.5", "", { "dependencies": { "camel-case": "^4.1.2", "fast-glob": "^3.3.3" } }, "sha512-Qf/V/hRo6DK0FoBKJ9QiObasRxHAhcNi0mV6kW2JMawxS3zq6Un+VsZmVAZDUfvB+MjTEiJ2tUJUl4cr0JiUAw=="], - - "aws4": ["aws4@1.13.2", "", {}, "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw=="], - - "axios": ["axios@1.10.0", "", { "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } }, "sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw=="], - - "b4a": ["b4a@1.6.7", "", {}, "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg=="], - - "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], - - "bare-events": ["bare-events@2.5.4", "", {}, "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA=="], - - "bare-fs": ["bare-fs@4.1.5", "", { "dependencies": { "bare-events": "^2.5.4", "bare-path": "^3.0.0", "bare-stream": "^2.6.4" }, "peerDependencies": { "bare-buffer": "*" }, "optionalPeers": ["bare-buffer"] }, "sha512-1zccWBMypln0jEE05LzZt+V/8y8AQsQQqxtklqaIyg5nu6OAYFhZxPXinJTSG+kU5qyNmeLgcn9AW7eHiCHVLA=="], - - "bare-os": ["bare-os@3.6.1", "", {}, "sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g=="], - - "bare-path": ["bare-path@3.0.0", "", { "dependencies": { "bare-os": "^3.0.1" } }, "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw=="], - - "bare-stream": ["bare-stream@2.6.5", "", { "dependencies": { "streamx": "^2.21.0" }, "peerDependencies": { "bare-buffer": "*", "bare-events": "*" }, "optionalPeers": ["bare-buffer", "bare-events"] }, "sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA=="], - - "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], - - "base64id": ["base64id@2.0.0", "", {}, "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog=="], - - "basic-ftp": ["basic-ftp@5.0.5", "", {}, "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg=="], - - "bcrypt-pbkdf": ["bcrypt-pbkdf@1.0.2", "", { "dependencies": { "tweetnacl": "^0.14.3" } }, "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w=="], - - "big-integer": ["big-integer@1.6.52", "", {}, "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg=="], - - "binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="], - - "bindings": ["bindings@1.5.0", "", { "dependencies": { "file-uri-to-path": "1.0.0" } }, "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ=="], - - "bl": ["bl@4.1.0", "", { "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", "readable-stream": "^3.4.0" } }, "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w=="], - - "body-parser": ["body-parser@2.2.0", "", { "dependencies": { "bytes": "^3.1.2", "content-type": "^1.0.5", "debug": "^4.4.0", "http-errors": "^2.0.0", "iconv-lite": "^0.6.3", "on-finished": "^2.4.1", "qs": "^6.14.0", "raw-body": "^3.0.0", "type-is": "^2.0.0" } }, "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg=="], - - "bowser": ["bowser@2.11.0", "", {}, "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA=="], - - "bplist-parser": ["bplist-parser@0.2.0", "", { "dependencies": { "big-integer": "^1.6.44" } }, "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw=="], - - "brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], - - "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], - - "browserslist": ["browserslist@4.25.0", "", { "dependencies": { "caniuse-lite": "^1.0.30001718", "electron-to-chromium": "^1.5.160", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA=="], - - "bson": ["bson@6.10.4", "", {}, "sha512-WIsKqkSC0ABoBJuT1LEX+2HEvNmNKKgnTAyd0fL8qzK4SH2i9NXg+t08YtdZp/V9IZ33cxe3iV4yM0qg8lMQng=="], - - "buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="], - - "buffer-crc32": ["buffer-crc32@1.0.0", "", {}, "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w=="], - - "buildcheck": ["buildcheck@0.0.6", "", {}, "sha512-8f9ZJCUXyT1M35Jx7MkBgmBMo3oHTTBIPLiY9xyL0pl3T5RwcPEY8cUHr5LBNfu/fk6c2T4DJZuVM/8ZZT2D2A=="], - - "bullmq": ["bullmq@5.55.0", "", { "dependencies": { "cron-parser": "^4.9.0", "ioredis": "^5.4.1", "msgpackr": "^1.11.2", "node-abort-controller": "^3.1.1", "semver": "^7.5.4", "tslib": "^2.0.0", "uuid": "^9.0.0" } }, "sha512-LKaQZroyXBYSQd/SNP9EcmCZgiZjIImtQHBlnupUvhX1GmmJfIXjn0bf8lek3bvajMUbvVf8FrYdFD0ajAuy0g=="], - - "bun-types": ["bun-types@1.2.17", "", { "dependencies": { "@types/node": "*" } }, "sha512-ElC7ItwT3SCQwYZDYoAH+q6KT4Fxjl8DtZ6qDulUFBmXA8YB4xo+l54J9ZJN+k2pphfn9vk7kfubeSd5QfTVJQ=="], - - "bundle-name": ["bundle-name@3.0.0", "", { "dependencies": { "run-applescript": "^5.0.0" } }, "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw=="], - - "byline": ["byline@5.0.0", "", {}, "sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q=="], - - "bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="], - - "cacheable-lookup": ["cacheable-lookup@7.0.0", "", {}, "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w=="], - - "cacheable-request": ["cacheable-request@12.0.1", "", { "dependencies": { "@types/http-cache-semantics": "^4.0.4", "get-stream": "^9.0.1", "http-cache-semantics": "^4.1.1", "keyv": "^4.5.4", "mimic-response": "^4.0.0", "normalize-url": "^8.0.1", "responselike": "^3.0.0" } }, "sha512-Yo9wGIQUaAfIbk+qY0X4cDQgCosecfBe3V9NSyeY4qPC2SAkbCS4Xj79VP8WOzitpJUZKc/wsRCYF5ariDIwkg=="], - - "call-bind": ["call-bind@1.0.8", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", "get-intrinsic": "^1.2.4", "set-function-length": "^1.2.2" } }, "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww=="], - - "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], - - "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], - - "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], - - "camel-case": ["camel-case@4.1.2", "", { "dependencies": { "pascal-case": "^3.1.2", "tslib": "^2.0.3" } }, "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw=="], - - "camelcase": ["camelcase@6.3.0", "", {}, "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA=="], - - "camelcase-css": ["camelcase-css@2.0.1", "", {}, "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA=="], - - "caniuse-lite": ["caniuse-lite@1.0.30001724", "", {}, "sha512-WqJo7p0TbHDOythNTqYujmaJTvtYRZrjpP8TCvH6Vb9CYJerJNKamKzIWOM4BkQatWj9H2lYulpdAQNBe7QhNA=="], - - "cargo-cp-artifact": ["cargo-cp-artifact@0.1.9", "", { "bin": { "cargo-cp-artifact": "bin/cargo-cp-artifact.js" } }, "sha512-6F+UYzTaGB+awsTXg0uSJA1/b/B3DDJzpKVRu0UmyI7DmNeaAl2RFHuTGIN6fEgpadRxoXGb7gbC1xo4C3IdyA=="], - - "chalk": ["chalk@5.4.1", "", {}, "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w=="], - - "chokidar": ["chokidar@3.6.0", "", { "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" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="], - - "chownr": ["chownr@1.1.4", "", {}, "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="], - - "cli-table": ["cli-table@0.3.11", "", { "dependencies": { "colors": "1.0.3" } }, "sha512-IqLQi4lO0nIB4tcdTpN4LCB9FI3uqrJZK7RC515EnhZ6qBaglkIgICb1wjeAqpdoOabm1+SuQtkXIPdYC93jhQ=="], - - "client-only": ["client-only@0.0.1", "", {}, "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA=="], - - "cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], - - "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], - - "cluster-key-slot": ["cluster-key-slot@1.1.2", "", {}, "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA=="], - - "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], - - "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], - - "colorette": ["colorette@2.0.20", "", {}, "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w=="], - - "colors": ["colors@1.0.3", "", {}, "sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw=="], - - "combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="], - - "commander": ["commander@11.1.0", "", {}, "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ=="], - - "commondir": ["commondir@1.0.1", "", {}, "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg=="], - - "component-emitter": ["component-emitter@1.3.1", "", {}, "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ=="], - - "compress-commons": ["compress-commons@6.0.2", "", { "dependencies": { "crc-32": "^1.2.0", "crc32-stream": "^6.0.0", "is-stream": "^2.0.1", "normalize-path": "^3.0.0", "readable-stream": "^4.0.0" } }, "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg=="], - - "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], - - "content-disposition": ["content-disposition@1.0.0", "", { "dependencies": { "safe-buffer": "5.2.1" } }, "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg=="], - - "content-type": ["content-type@1.0.5", "", {}, "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="], - - "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], - - "cookie": ["cookie@0.7.2", "", {}, "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w=="], - - "cookie-signature": ["cookie-signature@1.2.2", "", {}, "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg=="], - - "cookiejar": ["cookiejar@2.1.4", "", {}, "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw=="], - - "core-util-is": ["core-util-is@1.0.3", "", {}, "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="], - - "cors": ["cors@2.8.5", "", { "dependencies": { "object-assign": "^4", "vary": "^1" } }, "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g=="], - - "cpu-features": ["cpu-features@0.0.10", "", { "dependencies": { "buildcheck": "~0.0.6", "nan": "^2.19.0" } }, "sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA=="], - - "crc-32": ["crc-32@1.2.2", "", { "bin": { "crc32": "bin/crc32.njs" } }, "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ=="], - - "crc32-stream": ["crc32-stream@6.0.0", "", { "dependencies": { "crc-32": "^1.2.0", "readable-stream": "^4.0.0" } }, "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g=="], - - "cron-parser": ["cron-parser@4.9.0", "", { "dependencies": { "luxon": "^3.2.1" } }, "sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q=="], - - "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], - - "cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="], - - "csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="], - - "d3-array": ["d3-array@3.2.4", "", { "dependencies": { "internmap": "1 - 2" } }, "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg=="], - - "d3-color": ["d3-color@3.1.0", "", {}, "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA=="], - - "d3-ease": ["d3-ease@3.0.1", "", {}, "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w=="], - - "d3-format": ["d3-format@3.1.0", "", {}, "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA=="], - - "d3-interpolate": ["d3-interpolate@3.0.1", "", { "dependencies": { "d3-color": "1 - 3" } }, "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g=="], - - "d3-path": ["d3-path@3.1.0", "", {}, "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ=="], - - "d3-scale": ["d3-scale@4.0.2", "", { "dependencies": { "d3-array": "2.10.0 - 3", "d3-format": "1 - 3", "d3-interpolate": "1.2.0 - 3", "d3-time": "2.1.1 - 3", "d3-time-format": "2 - 4" } }, "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ=="], - - "d3-shape": ["d3-shape@3.2.0", "", { "dependencies": { "d3-path": "^3.1.0" } }, "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA=="], - - "d3-time": ["d3-time@3.1.0", "", { "dependencies": { "d3-array": "2 - 3" } }, "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q=="], - - "d3-time-format": ["d3-time-format@4.1.0", "", { "dependencies": { "d3-time": "1 - 3" } }, "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg=="], - - "d3-timer": ["d3-timer@3.0.1", "", {}, "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA=="], - - "data-uri-to-buffer": ["data-uri-to-buffer@4.0.1", "", {}, "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A=="], - - "data-view-buffer": ["data-view-buffer@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" } }, "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ=="], - - "data-view-byte-length": ["data-view-byte-length@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" } }, "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ=="], - - "data-view-byte-offset": ["data-view-byte-offset@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-data-view": "^1.0.1" } }, "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ=="], - - "date-fns": ["date-fns@3.6.0", "", {}, "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww=="], - - "dateformat": ["dateformat@4.6.3", "", {}, "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA=="], - - "debug": ["debug@4.4.1", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="], - - "decimal.js-light": ["decimal.js-light@2.5.1", "", {}, "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg=="], - - "decompress-response": ["decompress-response@6.0.0", "", { "dependencies": { "mimic-response": "^3.1.0" } }, "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ=="], - - "deep-extend": ["deep-extend@0.6.0", "", {}, "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="], - - "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], - - "default-browser": ["default-browser@4.0.0", "", { "dependencies": { "bundle-name": "^3.0.0", "default-browser-id": "^3.0.0", "execa": "^7.1.1", "titleize": "^3.0.0" } }, "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA=="], - - "default-browser-id": ["default-browser-id@3.0.0", "", { "dependencies": { "bplist-parser": "^0.2.0", "untildify": "^4.0.0" } }, "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA=="], - - "defer-to-connect": ["defer-to-connect@2.0.1", "", {}, "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg=="], - - "define-data-property": ["define-data-property@1.1.4", "", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.0.1" } }, "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A=="], - - "define-lazy-prop": ["define-lazy-prop@3.0.0", "", {}, "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg=="], - - "define-properties": ["define-properties@1.2.1", "", { "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } }, "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg=="], - - "degenerator": ["degenerator@5.0.1", "", { "dependencies": { "ast-types": "^0.13.4", "escodegen": "^2.1.0", "esprima": "^4.0.1" } }, "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ=="], - - "delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="], - - "denque": ["denque@2.1.0", "", {}, "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw=="], - - "depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="], - - "destroy": ["destroy@1.2.0", "", {}, "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="], - - "detect-libc": ["detect-libc@2.0.4", "", {}, "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA=="], - - "dezalgo": ["dezalgo@1.0.4", "", { "dependencies": { "asap": "^2.0.0", "wrappy": "1" } }, "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig=="], - - "didyoumean": ["didyoumean@1.2.2", "", {}, "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw=="], - - "dir-glob": ["dir-glob@3.0.1", "", { "dependencies": { "path-type": "^4.0.0" } }, "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA=="], - - "discontinuous-range": ["discontinuous-range@1.0.0", "", {}, "sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ=="], - - "dlv": ["dlv@1.1.3", "", {}, "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="], - - "docker-compose": ["docker-compose@0.24.8", "", { "dependencies": { "yaml": "^2.2.2" } }, "sha512-plizRs/Vf15H+GCVxq2EUvyPK7ei9b/cVesHvjnX4xaXjM9spHe2Ytq0BitndFgvTJ3E3NljPNUEl7BAN43iZw=="], - - "docker-modem": ["docker-modem@5.0.6", "", { "dependencies": { "debug": "^4.1.1", "readable-stream": "^3.5.0", "split-ca": "^1.0.1", "ssh2": "^1.15.0" } }, "sha512-ens7BiayssQz/uAxGzH8zGXCtiV24rRWXdjNha5V4zSOcxmAZsfGVm/PPFbwQdqEkDnhG+SyR9E3zSHUbOKXBQ=="], - - "dockerode": ["dockerode@4.0.7", "", { "dependencies": { "@balena/dockerignore": "^1.0.2", "@grpc/grpc-js": "^1.11.1", "@grpc/proto-loader": "^0.7.13", "docker-modem": "^5.0.6", "protobufjs": "^7.3.2", "tar-fs": "~2.1.2", "uuid": "^10.0.0" } }, "sha512-R+rgrSRTRdU5mH14PZTCPZtW/zw3HDWNTS/1ZAQpL/5Upe/ye5K9WQkIysu4wBoiMwKynsz0a8qWuGsHgEvSAA=="], - - "doctrine": ["doctrine@2.1.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw=="], - - "dom-helpers": ["dom-helpers@5.2.1", "", { "dependencies": { "@babel/runtime": "^7.8.7", "csstype": "^3.0.2" } }, "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA=="], - - "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], - - "eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="], - - "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="], - - "electron-to-chromium": ["electron-to-chromium@1.5.171", "", {}, "sha512-scWpzXEJEMrGJa4Y6m/tVotb0WuvNmasv3wWVzUAeCgKU0ToFOhUW6Z+xWnRQANMYGxN4ngJXIThgBJOqzVPCQ=="], - - "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], - - "encodeurl": ["encodeurl@2.0.0", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="], - - "end-of-stream": ["end-of-stream@1.4.5", "", { "dependencies": { "once": "^1.4.0" } }, "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg=="], - - "engine.io": ["engine.io@6.6.4", "", { "dependencies": { "@types/cors": "^2.8.12", "@types/node": ">=10.0.0", "accepts": "~1.3.4", "base64id": "2.0.0", "cookie": "~0.7.2", "cors": "~2.8.5", "debug": "~4.3.1", "engine.io-parser": "~5.2.1", "ws": "~8.17.1" } }, "sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g=="], - - "engine.io-client": ["engine.io-client@6.6.3", "", { "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.1", "engine.io-parser": "~5.2.1", "ws": "~8.17.1", "xmlhttprequest-ssl": "~2.1.1" } }, "sha512-T0iLjnyNWahNyv/lcjS2y4oE358tVS/SYQNxYXGAJ9/GLgH4VCvOQ/mhTjqU88mLZCQgiG8RIegFHYCdVC+j5w=="], - - "engine.io-parser": ["engine.io-parser@5.2.3", "", {}, "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q=="], - - "es-abstract": ["es-abstract@1.24.0", "", { "dependencies": { "array-buffer-byte-length": "^1.0.2", "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "data-view-buffer": "^1.0.2", "data-view-byte-length": "^1.0.2", "data-view-byte-offset": "^1.0.1", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "es-set-tostringtag": "^2.1.0", "es-to-primitive": "^1.3.0", "function.prototype.name": "^1.1.8", "get-intrinsic": "^1.3.0", "get-proto": "^1.0.1", "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "internal-slot": "^1.1.0", "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", "is-data-view": "^1.0.2", "is-negative-zero": "^2.0.3", "is-regex": "^1.2.1", "is-set": "^2.0.3", "is-shared-array-buffer": "^1.0.4", "is-string": "^1.1.1", "is-typed-array": "^1.1.15", "is-weakref": "^1.1.1", "math-intrinsics": "^1.1.0", "object-inspect": "^1.13.4", "object-keys": "^1.1.1", "object.assign": "^4.1.7", "own-keys": "^1.0.1", "regexp.prototype.flags": "^1.5.4", "safe-array-concat": "^1.1.3", "safe-push-apply": "^1.0.0", "safe-regex-test": "^1.1.0", "set-proto": "^1.0.0", "stop-iteration-iterator": "^1.1.0", "string.prototype.trim": "^1.2.10", "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", "typed-array-buffer": "^1.0.3", "typed-array-byte-length": "^1.0.3", "typed-array-byte-offset": "^1.0.4", "typed-array-length": "^1.0.7", "unbox-primitive": "^1.1.0", "which-typed-array": "^1.1.19" } }, "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg=="], - - "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], - - "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], - - "es-iterator-helpers": ["es-iterator-helpers@1.2.1", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-abstract": "^1.23.6", "es-errors": "^1.3.0", "es-set-tostringtag": "^2.0.3", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.6", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "internal-slot": "^1.1.0", "iterator.prototype": "^1.1.4", "safe-array-concat": "^1.1.3" } }, "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w=="], - - "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="], - - "es-set-tostringtag": ["es-set-tostringtag@2.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="], - - "es-shim-unscopables": ["es-shim-unscopables@1.1.0", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw=="], - - "es-to-primitive": ["es-to-primitive@1.3.0", "", { "dependencies": { "is-callable": "^1.2.7", "is-date-object": "^1.0.5", "is-symbol": "^1.0.4" } }, "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g=="], - - "esbuild": ["esbuild@0.25.5", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.5", "@esbuild/android-arm": "0.25.5", "@esbuild/android-arm64": "0.25.5", "@esbuild/android-x64": "0.25.5", "@esbuild/darwin-arm64": "0.25.5", "@esbuild/darwin-x64": "0.25.5", "@esbuild/freebsd-arm64": "0.25.5", "@esbuild/freebsd-x64": "0.25.5", "@esbuild/linux-arm": "0.25.5", "@esbuild/linux-arm64": "0.25.5", "@esbuild/linux-ia32": "0.25.5", "@esbuild/linux-loong64": "0.25.5", "@esbuild/linux-mips64el": "0.25.5", "@esbuild/linux-ppc64": "0.25.5", "@esbuild/linux-riscv64": "0.25.5", "@esbuild/linux-s390x": "0.25.5", "@esbuild/linux-x64": "0.25.5", "@esbuild/netbsd-arm64": "0.25.5", "@esbuild/netbsd-x64": "0.25.5", "@esbuild/openbsd-arm64": "0.25.5", "@esbuild/openbsd-x64": "0.25.5", "@esbuild/sunos-x64": "0.25.5", "@esbuild/win32-arm64": "0.25.5", "@esbuild/win32-ia32": "0.25.5", "@esbuild/win32-x64": "0.25.5" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ=="], - - "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], - - "escape-html": ["escape-html@1.0.3", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="], - - "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - - "escodegen": ["escodegen@2.1.0", "", { "dependencies": { "esprima": "^4.0.1", "estraverse": "^5.2.0", "esutils": "^2.0.2" }, "optionalDependencies": { "source-map": "~0.6.1" }, "bin": { "esgenerate": "bin/esgenerate.js", "escodegen": "bin/escodegen.js" } }, "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w=="], - - "eslint": ["eslint@9.29.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.20.1", "@eslint/config-helpers": "^0.2.1", "@eslint/core": "^0.14.0", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.29.0", "@eslint/plugin-kit": "^0.3.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-GsGizj2Y1rCWDu6XoEekL3RLilp0voSePurjZIkxL3wlm5o5EC9VpgaP7lrCvjnkuLvzFBQWB3vWB3K5KQTveQ=="], - - "eslint-import-resolver-node": ["eslint-import-resolver-node@0.3.9", "", { "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.13.0", "resolve": "^1.22.4" } }, "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g=="], - - "eslint-module-utils": ["eslint-module-utils@2.12.1", "", { "dependencies": { "debug": "^3.2.7" } }, "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw=="], - - "eslint-plugin-es": ["eslint-plugin-es@3.0.1", "", { "dependencies": { "eslint-utils": "^2.0.0", "regexpp": "^3.0.0" }, "peerDependencies": { "eslint": ">=4.19.1" } }, "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ=="], - - "eslint-plugin-import": ["eslint-plugin-import@2.32.0", "", { "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.9", "array.prototype.findlastindex": "^1.2.6", "array.prototype.flat": "^1.3.3", "array.prototype.flatmap": "^1.3.3", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", "eslint-module-utils": "^2.12.1", "hasown": "^2.0.2", "is-core-module": "^2.16.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", "object.fromentries": "^2.0.8", "object.groupby": "^1.0.3", "object.values": "^1.2.1", "semver": "^6.3.1", "string.prototype.trimend": "^1.0.9", "tsconfig-paths": "^3.15.0" }, "peerDependencies": { "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA=="], - - "eslint-plugin-node": ["eslint-plugin-node@11.1.0", "", { "dependencies": { "eslint-plugin-es": "^3.0.0", "eslint-utils": "^2.0.0", "ignore": "^5.1.1", "minimatch": "^3.0.4", "resolve": "^1.10.1", "semver": "^6.1.0" }, "peerDependencies": { "eslint": ">=5.16.0" } }, "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g=="], - - "eslint-plugin-promise": ["eslint-plugin-promise@7.2.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" } }, "sha512-SWKjd+EuvWkYaS+uN2csvj0KoP43YTu7+phKQ5v+xw6+A0gutVX2yqCeCkC3uLCJFiPfR2dD8Es5L7yUsmvEaA=="], - - "eslint-plugin-react": ["eslint-plugin-react@7.37.5", "", { "dependencies": { "array-includes": "^3.1.8", "array.prototype.findlast": "^1.2.5", "array.prototype.flatmap": "^1.3.3", "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", "es-iterator-helpers": "^1.2.1", "estraverse": "^5.3.0", "hasown": "^2.0.2", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", "object.entries": "^1.1.9", "object.fromentries": "^2.0.8", "object.values": "^1.2.1", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.5", "semver": "^6.3.1", "string.prototype.matchall": "^4.0.12", "string.prototype.repeat": "^1.0.0" }, "peerDependencies": { "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" } }, "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA=="], - - "eslint-plugin-react-hooks": ["eslint-plugin-react-hooks@4.6.2", "", { "peerDependencies": { "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" } }, "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ=="], - - "eslint-plugin-react-refresh": ["eslint-plugin-react-refresh@0.4.20", "", { "peerDependencies": { "eslint": ">=8.40" } }, "sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA=="], - - "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], - - "eslint-utils": ["eslint-utils@2.1.0", "", { "dependencies": { "eslint-visitor-keys": "^1.1.0" } }, "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg=="], - - "eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], - - "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], - - "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], - - "esquery": ["esquery@1.6.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg=="], - - "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="], - - "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], - - "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], - - "etag": ["etag@1.8.1", "", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="], - - "event-target-shim": ["event-target-shim@5.0.1", "", {}, "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ=="], - - "eventemitter3": ["eventemitter3@5.0.1", "", {}, "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="], - - "events": ["events@3.3.0", "", {}, "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="], - - "eventsource": ["eventsource@3.0.7", "", { "dependencies": { "eventsource-parser": "^3.0.1" } }, "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA=="], - - "eventsource-parser": ["eventsource-parser@3.0.2", "", {}, "sha512-6RxOBZ/cYgd8usLwsEl+EC09Au/9BcmCKYF2/xbml6DNczf7nv0MQb+7BA2F+li6//I+28VNlQR37XfQtcAJuA=="], - - "execa": ["execa@7.2.0", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.1", "human-signals": "^4.3.0", "is-stream": "^3.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^5.1.0", "onetime": "^6.0.0", "signal-exit": "^3.0.7", "strip-final-newline": "^3.0.0" } }, "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA=="], - - "expand-template": ["expand-template@2.0.3", "", {}, "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg=="], - - "express": ["express@5.1.0", "", { "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.0", "content-disposition": "^1.0.0", "content-type": "^1.0.5", "cookie": "^0.7.1", "cookie-signature": "^1.2.1", "debug": "^4.4.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "finalhandler": "^2.1.0", "fresh": "^2.0.0", "http-errors": "^2.0.0", "merge-descriptors": "^2.0.0", "mime-types": "^3.0.0", "on-finished": "^2.4.1", "once": "^1.4.0", "parseurl": "^1.3.3", "proxy-addr": "^2.0.7", "qs": "^6.14.0", "range-parser": "^1.2.1", "router": "^2.2.0", "send": "^1.1.0", "serve-static": "^2.2.0", "statuses": "^2.0.1", "type-is": "^2.0.1", "vary": "^1.1.2" } }, "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA=="], - - "express-rate-limit": ["express-rate-limit@7.5.1", "", { "peerDependencies": { "express": ">= 4.11" } }, "sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw=="], - - "fancy-canvas": ["fancy-canvas@2.1.0", "", {}, "sha512-nifxXJ95JNLFR2NgRV4/MxVP45G9909wJTEKz5fg/TZS20JJZA6hfgRVh/bC9bwl2zBtBNcYPjiBE4njQHVBwQ=="], - - "fast-copy": ["fast-copy@3.0.2", "", {}, "sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ=="], - - "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], - - "fast-equals": ["fast-equals@5.2.2", "", {}, "sha512-V7/RktU11J3I36Nwq2JnZEM7tNm17eBJz+u25qdxBZeCKiX6BkVSZQjwWIr+IobgnZy+ag73tTZgZi7tr0LrBw=="], - - "fast-fifo": ["fast-fifo@1.3.2", "", {}, "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ=="], - - "fast-glob": ["fast-glob@3.3.3", "", { "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.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], - - "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="], - - "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="], - - "fast-redact": ["fast-redact@3.5.0", "", {}, "sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A=="], - - "fast-safe-stringify": ["fast-safe-stringify@2.1.1", "", {}, "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA=="], - - "fast-uri": ["fast-uri@3.0.6", "", {}, "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw=="], - - "fast-xml-parser": ["fast-xml-parser@4.4.1", "", { "dependencies": { "strnum": "^1.0.5" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw=="], - - "fastq": ["fastq@1.19.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ=="], - - "fd-package-json": ["fd-package-json@2.0.0", "", { "dependencies": { "walk-up-path": "^4.0.0" } }, "sha512-jKmm9YtsNXN789RS/0mSzOC1NUq9mkVd65vbSSVsKdjGvYXBuE4oWe2QOEoFeRmJg+lPuZxpmrfFclNhoRMneQ=="], - - "fetch-blob": ["fetch-blob@3.2.0", "", { "dependencies": { "node-domexception": "^1.0.0", "web-streams-polyfill": "^3.0.3" } }, "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ=="], - - "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="], - - "file-uri-to-path": ["file-uri-to-path@1.0.0", "", {}, "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw=="], - - "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], - - "finalhandler": ["finalhandler@2.1.0", "", { "dependencies": { "debug": "^4.4.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "on-finished": "^2.4.1", "parseurl": "^1.3.3", "statuses": "^2.0.1" } }, "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q=="], - - "find-cache-dir": ["find-cache-dir@3.3.2", "", { "dependencies": { "commondir": "^1.0.1", "make-dir": "^3.0.2", "pkg-dir": "^4.1.0" } }, "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig=="], - - "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="], - - "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="], - - "flatted": ["flatted@3.3.3", "", {}, "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg=="], - - "follow-redirects": ["follow-redirects@1.15.9", "", {}, "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ=="], - - "for-each": ["for-each@0.3.5", "", { "dependencies": { "is-callable": "^1.2.7" } }, "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg=="], - - "foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="], - - "form-data": ["form-data@4.0.3", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA=="], - - "form-data-encoder": ["form-data-encoder@4.1.0", "", {}, "sha512-G6NsmEW15s0Uw9XnCg+33H3ViYRyiM0hMrMhhqQOR8NFc5GhYrI+6I3u7OTw7b91J2g8rtvMBZJDbcGb2YUniw=="], - - "formatly": ["formatly@0.2.4", "", { "dependencies": { "fd-package-json": "^2.0.0" }, "bin": { "formatly": "bin/index.mjs" } }, "sha512-lIN7GpcvX/l/i24r/L9bnJ0I8Qn01qijWpQpDDvTLL29nKqSaJJu4h20+7VJ6m2CAhQ2/En/GbxDiHCzq/0MyA=="], - - "formdata-polyfill": ["formdata-polyfill@4.0.10", "", { "dependencies": { "fetch-blob": "^3.1.2" } }, "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g=="], - - "formidable": ["formidable@2.1.5", "", { "dependencies": { "@paralleldrive/cuid2": "^2.2.2", "dezalgo": "^1.0.4", "once": "^1.4.0", "qs": "^6.11.0" } }, "sha512-Oz5Hwvwak/DCaXVVUtPn4oLMLLy1CdclLKO1LFgU7XzDpVMUU5UjlSLpGMocyQNNk8F6IJW9M/YdooSn2MRI+Q=="], - - "forwarded": ["forwarded@0.2.0", "", {}, "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="], - - "fraction.js": ["fraction.js@4.3.7", "", {}, "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew=="], - - "fresh": ["fresh@2.0.0", "", {}, "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A=="], - - "fs-constants": ["fs-constants@1.0.0", "", {}, "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="], - - "fs.realpath": ["fs.realpath@1.0.0", "", {}, "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="], - - "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], - - "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], - - "function.prototype.name": ["function.prototype.name@1.1.8", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "functions-have-names": "^1.2.3", "hasown": "^2.0.2", "is-callable": "^1.2.7" } }, "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q=="], - - "functional-red-black-tree": ["functional-red-black-tree@1.0.1", "", {}, "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g=="], - - "functions-have-names": ["functions-have-names@1.2.3", "", {}, "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ=="], - - "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="], - - "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], - - "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], - - "get-port": ["get-port@7.1.0", "", {}, "sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw=="], - - "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], - - "get-stream": ["get-stream@9.0.1", "", { "dependencies": { "@sec-ant/readable-stream": "^0.4.1", "is-stream": "^4.0.1" } }, "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA=="], - - "get-symbol-description": ["get-symbol-description@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6" } }, "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg=="], - - "get-tsconfig": ["get-tsconfig@4.10.1", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ=="], - - "get-uri": ["get-uri@6.0.4", "", { "dependencies": { "basic-ftp": "^5.0.2", "data-uri-to-buffer": "^6.0.2", "debug": "^4.3.4" } }, "sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ=="], - - "github-from-package": ["github-from-package@0.0.0", "", {}, "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw=="], - - "glob": ["glob@10.4.5", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg=="], - - "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], - - "globals": ["globals@13.24.0", "", { "dependencies": { "type-fest": "^0.20.2" } }, "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ=="], - - "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], - - "globby": ["globby@11.1.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" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], - - "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], - - "got": ["got@14.4.7", "", { "dependencies": { "@sindresorhus/is": "^7.0.1", "@szmarczak/http-timer": "^5.0.1", "cacheable-lookup": "^7.0.0", "cacheable-request": "^12.0.1", "decompress-response": "^6.0.0", "form-data-encoder": "^4.0.2", "http2-wrapper": "^2.2.1", "lowercase-keys": "^3.0.0", "p-cancelable": "^4.0.1", "responselike": "^3.0.0", "type-fest": "^4.26.1" } }, "sha512-DI8zV1231tqiGzOiOzQWDhsBmncFW7oQDH6Zgy6pDPrqJuVZMtoSgPLLsBZQj8Jg4JFfwoOsDA8NGtLQLnIx2g=="], - - "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], - - "graphemer": ["graphemer@1.4.0", "", {}, "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="], - - "handlebars": ["handlebars@4.7.8", "", { "dependencies": { "minimist": "^1.2.5", "neo-async": "^2.6.2", "source-map": "^0.6.1", "wordwrap": "^1.0.0" }, "optionalDependencies": { "uglify-js": "^3.1.4" }, "bin": { "handlebars": "bin/handlebars" } }, "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ=="], - - "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="], - - "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], - - "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], - - "has-proto": ["has-proto@1.2.0", "", { "dependencies": { "dunder-proto": "^1.0.0" } }, "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ=="], - - "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], - - "has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="], - - "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], - - "heap-js": ["heap-js@2.6.0", "", {}, "sha512-trFMIq3PATiFRiQmNNeHtsrkwYRByIXUbYNbotiY9RLVfMkdwZdd2eQ38mGt7BRiCKBaj1DyBAIHmm7mmXPuuw=="], - - "help-me": ["help-me@5.0.0", "", {}, "sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg=="], - - "hono": ["hono@4.8.2", "", {}, "sha512-hM+1RIn9PK1I6SiTNS6/y7O1mvg88awYLFEuEtoiMtRyT3SD2iu9pSFgbBXT3b1Ua4IwzvSTLvwO0SEhDxCi4w=="], - - "http-cache-semantics": ["http-cache-semantics@4.2.0", "", {}, "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ=="], - - "http-errors": ["http-errors@2.0.0", "", { "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", "statuses": "2.0.1", "toidentifier": "1.0.1" } }, "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ=="], - - "http-proxy-agent": ["http-proxy-agent@7.0.2", "", { "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" } }, "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig=="], - - "http2-wrapper": ["http2-wrapper@2.2.1", "", { "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.2.0" } }, "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ=="], - - "https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], - - "human-signals": ["human-signals@4.3.1", "", {}, "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ=="], - - "iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="], - - "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], - - "ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], - - "immutable": ["immutable@4.3.7", "", {}, "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw=="], - - "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], - - "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], - - "inflight": ["inflight@1.0.6", "", { "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA=="], - - "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], - - "ini": ["ini@1.3.8", "", {}, "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="], - - "internal-slot": ["internal-slot@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.2", "side-channel": "^1.1.0" } }, "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw=="], - - "internmap": ["internmap@2.0.3", "", {}, "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg=="], - - "ioredis": ["ioredis@5.6.1", "", { "dependencies": { "@ioredis/commands": "^1.1.1", "cluster-key-slot": "^1.1.0", "debug": "^4.3.4", "denque": "^2.1.0", "lodash.defaults": "^4.2.0", "lodash.isarguments": "^3.1.0", "redis-errors": "^1.2.0", "redis-parser": "^3.0.0", "standard-as-callback": "^2.1.0" } }, "sha512-UxC0Yv1Y4WRJiGQxQkP0hfdL0/5/6YvdfOOClRgJ0qppSarkhneSa6UvkMkms0AkdGimSH3Ikqm+6mkMmX7vGA=="], - - "ip-address": ["ip-address@9.0.5", "", { "dependencies": { "jsbn": "1.1.0", "sprintf-js": "^1.1.3" } }, "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g=="], - - "ipaddr.js": ["ipaddr.js@1.9.1", "", {}, "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="], - - "ipv6-normalize": ["ipv6-normalize@1.0.1", "", {}, "sha512-Bm6H79i01DjgGTCWjUuCjJ6QDo1HB96PT/xCYuyJUP9WFbVDrLSbG4EZCvOCun2rNswZb0c3e4Jt/ws795esHA=="], - - "is-array-buffer": ["is-array-buffer@3.0.5", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A=="], - - "is-async-function": ["is-async-function@2.1.1", "", { "dependencies": { "async-function": "^1.0.0", "call-bound": "^1.0.3", "get-proto": "^1.0.1", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ=="], - - "is-bigint": ["is-bigint@1.1.0", "", { "dependencies": { "has-bigints": "^1.0.2" } }, "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ=="], - - "is-binary-path": ["is-binary-path@2.1.0", "", { "dependencies": { "binary-extensions": "^2.0.0" } }, "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="], - - "is-boolean-object": ["is-boolean-object@1.2.2", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A=="], - - "is-callable": ["is-callable@1.2.7", "", {}, "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA=="], - - "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="], - - "is-data-view": ["is-data-view@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "is-typed-array": "^1.1.13" } }, "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw=="], - - "is-date-object": ["is-date-object@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" } }, "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg=="], - - "is-docker": ["is-docker@3.0.0", "", { "bin": { "is-docker": "cli.js" } }, "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ=="], - - "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], - - "is-finalizationregistry": ["is-finalizationregistry@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg=="], - - "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], - - "is-generator-function": ["is-generator-function@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "get-proto": "^1.0.0", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ=="], - - "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], - - "is-inside-container": ["is-inside-container@1.0.0", "", { "dependencies": { "is-docker": "^3.0.0" }, "bin": { "is-inside-container": "cli.js" } }, "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA=="], - - "is-map": ["is-map@2.0.3", "", {}, "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw=="], - - "is-negative-zero": ["is-negative-zero@2.0.3", "", {}, "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw=="], - - "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], - - "is-number-object": ["is-number-object@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw=="], - - "is-path-inside": ["is-path-inside@3.0.3", "", {}, "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ=="], - - "is-promise": ["is-promise@4.0.0", "", {}, "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ=="], - - "is-regex": ["is-regex@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g=="], - - "is-set": ["is-set@2.0.3", "", {}, "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg=="], - - "is-shared-array-buffer": ["is-shared-array-buffer@1.0.4", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A=="], - - "is-stream": ["is-stream@4.0.1", "", {}, "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A=="], - - "is-string": ["is-string@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA=="], - - "is-symbol": ["is-symbol@1.1.1", "", { "dependencies": { "call-bound": "^1.0.2", "has-symbols": "^1.1.0", "safe-regex-test": "^1.1.0" } }, "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w=="], - - "is-typed-array": ["is-typed-array@1.1.15", "", { "dependencies": { "which-typed-array": "^1.1.16" } }, "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ=="], - - "is-weakmap": ["is-weakmap@2.0.2", "", {}, "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w=="], - - "is-weakref": ["is-weakref@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew=="], - - "is-weakset": ["is-weakset@2.0.4", "", { "dependencies": { "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ=="], - - "is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], - - "isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="], - - "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], - - "isnumber": ["isnumber@1.0.0", "", {}, "sha512-JLiSz/zsZcGFXPrB4I/AGBvtStkt+8QmksyZBZnVXnnK9XdTEyz0tX8CRYljtwYDuIuZzih6DpHQdi+3Q6zHPw=="], - - "iterator.prototype": ["iterator.prototype@1.1.5", "", { "dependencies": { "define-data-property": "^1.1.4", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.6", "get-proto": "^1.0.0", "has-symbols": "^1.1.0", "set-function-name": "^2.0.2" } }, "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g=="], - - "jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="], - - "jiti": ["jiti@1.21.7", "", { "bin": { "jiti": "bin/jiti.js" } }, "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A=="], - - "joi": ["joi@17.13.3", "", { "dependencies": { "@hapi/hoek": "^9.3.0", "@hapi/topo": "^5.1.0", "@sideway/address": "^4.1.5", "@sideway/formula": "^3.0.1", "@sideway/pinpoint": "^2.0.0" } }, "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA=="], - - "jose": ["jose@4.15.9", "", {}, "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA=="], - - "joycon": ["joycon@3.1.1", "", {}, "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw=="], - - "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], - - "js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], - - "jsbn": ["jsbn@1.1.0", "", {}, "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A=="], - - "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], - - "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], - - "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], - - "json-stable-stringify": ["json-stable-stringify@1.3.0", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "isarray": "^2.0.5", "jsonify": "^0.0.1", "object-keys": "^1.1.1" } }, "sha512-qtYiSSFlwot9XHtF9bD9c7rwKjr+RecWT//ZnPvSmEjpV5mmPOCN4j8UjY5hbjNkOwZ/jQv3J6R1/pL7RwgMsg=="], - - "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="], - - "json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="], - - "jsonify": ["jsonify@0.0.1", "", {}, "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg=="], - - "jsx-ast-utils": ["jsx-ast-utils@3.3.5", "", { "dependencies": { "array-includes": "^3.1.6", "array.prototype.flat": "^1.3.1", "object.assign": "^4.1.4", "object.values": "^1.1.6" } }, "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ=="], - - "kerberos": ["kerberos@2.1.0", "", { "dependencies": { "bindings": "^1.5.0", "node-addon-api": "^6.1.0", "prebuild-install": "7.1.1" } }, "sha512-HvOl6O6cyEN/8Z4CAocHe/sekJtvt5UrxUdCuu7bXDZ2Hnsy6OpsQbISW+lpm03vrbO2ir+1QQ5Sx/vMEhHnog=="], - - "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], - - "knip": ["knip@5.61.2", "", { "dependencies": { "@nodelib/fs.walk": "^1.2.3", "fast-glob": "^3.3.3", "formatly": "^0.2.4", "jiti": "^2.4.2", "js-yaml": "^4.1.0", "minimist": "^1.2.8", "oxc-resolver": "^11.1.0", "picocolors": "^1.1.1", "picomatch": "^4.0.1", "smol-toml": "^1.3.4", "strip-json-comments": "5.0.2", "zod": "^3.22.4", "zod-validation-error": "^3.0.3" }, "peerDependencies": { "@types/node": ">=18", "typescript": ">=5.0.4" }, "bin": { "knip": "bin/knip.js", "knip-bun": "bin/knip-bun.js" } }, "sha512-ZBv37zDvZj0/Xwk0e93xSjM3+5bjxgqJ0PH2GlB5tnWV0ktXtmatWLm+dLRUCT/vpO3SdGz2nNAfvVhuItUNcQ=="], - - "lazystream": ["lazystream@1.0.1", "", { "dependencies": { "readable-stream": "^2.0.5" } }, "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw=="], - - "lcov-parse": ["lcov-parse@1.0.0", "", { "bin": { "lcov-parse": "./bin/cli.js" } }, "sha512-aprLII/vPzuQvYZnDRU78Fns9I2Ag3gi4Ipga/hxnVMCZC8DnR2nI7XBqrPoywGfxqIx/DgarGvDJZAD3YBTgQ=="], - - "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], - - "lightweight-charts": ["lightweight-charts@4.2.3", "", { "dependencies": { "fancy-canvas": "2.1.0" } }, "sha512-5kS/2hY3wNYNzhnS8Gb+GAS07DX8GPF2YVDnd2NMC85gJVQ6RLU6YrXNgNJ6eg0AnWPwCnvaGtYmGky3HiLQEw=="], - - "lilconfig": ["lilconfig@3.1.3", "", {}, "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw=="], - - "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="], - - "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], - - "lodash": ["lodash@4.17.21", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="], - - "lodash.camelcase": ["lodash.camelcase@4.3.0", "", {}, "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="], - - "lodash.defaults": ["lodash.defaults@4.2.0", "", {}, "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ=="], - - "lodash.isarguments": ["lodash.isarguments@3.1.0", "", {}, "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg=="], - - "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], - - "lodash.truncate": ["lodash.truncate@4.4.2", "", {}, "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw=="], - - "long": ["long@5.3.2", "", {}, "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA=="], - - "loose-envify": ["loose-envify@1.4.0", "", { "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": { "loose-envify": "cli.js" } }, "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="], - - "lower-case": ["lower-case@2.0.2", "", { "dependencies": { "tslib": "^2.0.3" } }, "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg=="], - - "lowercase-keys": ["lowercase-keys@3.0.0", "", {}, "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ=="], - - "lru-cache": ["lru-cache@11.1.0", "", {}, "sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A=="], - - "luxon": ["luxon@3.6.1", "", {}, "sha512-tJLxrKJhO2ukZ5z0gyjY1zPh3Rh88Ej9P7jNrZiHMUXHae1yvI2imgOZtL1TO8TW6biMMKfTtAOoEJANgtWBMQ=="], - - "macos-export-certificate-and-key": ["macos-export-certificate-and-key@1.2.4", "", { "dependencies": { "bindings": "^1.5.0", "node-addon-api": "^4.3.0" }, "os": "darwin" }, "sha512-y5QZEywlBNKd+EhPZ1Hz1FmDbbeQKtuVHJaTlawdl7vXw9bi/4tJB2xSMwX4sMVcddy3gbQ8K0IqXAi2TpDo2g=="], - - "make-dir": ["make-dir@3.1.0", "", { "dependencies": { "semver": "^6.0.0" } }, "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw=="], - - "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], - - "media-typer": ["media-typer@1.1.0", "", {}, "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw=="], - - "memory-pager": ["memory-pager@1.5.0", "", {}, "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg=="], - - "merge-descriptors": ["merge-descriptors@2.0.0", "", {}, "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g=="], - - "merge-stream": ["merge-stream@2.0.0", "", {}, "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="], - - "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], - - "methods": ["methods@1.1.2", "", {}, "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w=="], - - "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], - - "mime": ["mime@2.6.0", "", { "bin": { "mime": "cli.js" } }, "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg=="], - - "mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], - - "mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], - - "mimic-fn": ["mimic-fn@4.0.0", "", {}, "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw=="], - - "mimic-response": ["mimic-response@4.0.0", "", {}, "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg=="], - - "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - - "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], - - "minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], - - "mkdirp": ["mkdirp@1.0.4", "", { "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="], - - "mkdirp-classic": ["mkdirp-classic@0.5.3", "", {}, "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A=="], - - "moment": ["moment@2.30.1", "", {}, "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how=="], - - "mongodb": ["mongodb@6.17.0", "", { "dependencies": { "@mongodb-js/saslprep": "^1.1.9", "bson": "^6.10.4", "mongodb-connection-string-url": "^3.0.0" }, "peerDependencies": { "@aws-sdk/credential-providers": "^3.188.0", "@mongodb-js/zstd": "^1.1.0 || ^2.0.0", "gcp-metadata": "^5.2.0", "kerberos": "^2.0.1", "mongodb-client-encryption": ">=6.0.0 <7", "snappy": "^7.2.2", "socks": "^2.7.1" }, "optionalPeers": ["@aws-sdk/credential-providers", "@mongodb-js/zstd", "gcp-metadata", "kerberos", "mongodb-client-encryption", "snappy", "socks"] }, "sha512-neerUzg/8U26cgruLysKEjJvoNSXhyID3RvzvdcpsIi2COYM3FS3o9nlH7fxFtefTb942dX3W9i37oPfCVj4wA=="], - - "mongodb-build-info": ["mongodb-build-info@1.7.2", "", { "dependencies": { "mongodb-connection-string-url": "^3.0.0" } }, "sha512-eoLFZvCIjcwijYJdxvYupj1c+55VAVm0o4gBJjrcDxxmmpm+bC4Ix9ayZbyhQdVXDZAGDi03NA0GghXjBVXnxg=="], - - "mongodb-client-encryption": ["mongodb-client-encryption@6.4.0", "", { "dependencies": { "node-addon-api": "^4.3.0", "prebuild-install": "^7.1.3" } }, "sha512-Un1W/5P4KjcUBPeJeSKFNaWH0/8PVsoSatDqyWM2bMK0Vu2Jjxy7ZTgDj1g+uChuqroB09s8LvppdsHpwxSTVA=="], - - "mongodb-connection-string-url": ["mongodb-connection-string-url@3.0.2", "", { "dependencies": { "@types/whatwg-url": "^11.0.2", "whatwg-url": "^14.1.0 || ^13.0.0" } }, "sha512-rMO7CGo/9BFwyZABcKAWL8UJwH/Kc2x0g72uhDWzG48URRax5TCIcJ7Rc3RZqffZzO/Gwff/jyKwCU9TN8gehA=="], - - "mongodb-log-writer": ["mongodb-log-writer@2.4.1", "", { "dependencies": { "heap-js": "^2.3.0" }, "peerDependencies": { "bson": "6.x" } }, "sha512-kTVWtiUbayr2S54WeOeHpXvR80ASwlmoMsA3LIxH+PVZle8ddq7cXJXM3O5kkuT+Uni9+YNOTBwoRYVQlIAEUQ=="], - - "mongodb-mcp-server": ["mongodb-mcp-server@0.1.1", "", { "dependencies": { "@modelcontextprotocol/sdk": "^1.8.0", "@mongodb-js/device-id": "^0.2.1", "@mongodb-js/devtools-connect": "^3.7.2", "@mongosh/service-provider-node-driver": "^3.6.0", "bson": "^6.10.3", "lru-cache": "^11.1.0", "mongodb": "^6.15.0", "mongodb-connection-string-url": "^3.0.2", "mongodb-log-writer": "^2.4.1", "mongodb-redact": "^1.1.6", "mongodb-schema": "^12.6.2", "node-machine-id": "1.1.12", "openapi-fetch": "^0.13.5", "simple-oauth2": "^5.1.0", "yargs-parser": "^21.1.1", "zod": "^3.24.2" }, "bin": { "mongodb-mcp-server": "dist/index.js" } }, "sha512-Ajyj4h3PYhGAwTXiOVrmFAIJ8xozSChdk1FgcI33UtGsdYaRkVA+hCswIVZp+ZBh8BJvIL8JvV3wM56hesppQQ=="], - - "mongodb-memory-server": ["mongodb-memory-server@9.5.0", "", { "dependencies": { "mongodb-memory-server-core": "9.5.0", "tslib": "^2.6.3" } }, "sha512-In3zRT40cLlVtpy7FK6b96Lby6JBAdXj8Kf9YrH4p1Aa2X4ptojq7SmiRR3x47Lo0/UCXXIwhJpkdbYY8kRZAw=="], - - "mongodb-memory-server-core": ["mongodb-memory-server-core@9.5.0", "", { "dependencies": { "async-mutex": "^0.4.1", "camelcase": "^6.3.0", "debug": "^4.3.7", "find-cache-dir": "^3.3.2", "follow-redirects": "^1.15.9", "https-proxy-agent": "^7.0.5", "mongodb": "^5.9.2", "new-find-package-json": "^2.0.0", "semver": "^7.6.3", "tar-stream": "^3.1.7", "tslib": "^2.6.3", "yauzl": "^3.1.3" } }, "sha512-Jb/V80JeYAKWaF4bPFme7SmTR6ew1PWgkpPUepLDfRraeN49i1cruxICeA4zz4T33W/o31N+zazP8wI8ebf7yw=="], - - "mongodb-ns": ["mongodb-ns@2.4.2", "", {}, "sha512-gYJjEYG4v4a1WSXgUf81OBoBRlj+Z1SlnQVO392fC/4a1CN7CLWDITajZWPFTPh/yRozYk6sHHtZwZmQhodBEA=="], - - "mongodb-redact": ["mongodb-redact@1.1.8", "", {}, "sha512-EbZ+q7LsVz7q8n49mGIcXgP2UiBp6R6vHEVbmGnF21ThCnP6AIho7wqpHqyjqqGjg54DoXQJTCwHPSknsCHv6g=="], - - "mongodb-schema": ["mongodb-schema@12.6.2", "", { "dependencies": { "reservoir": "^0.1.2" }, "optionalDependencies": { "bson": "^6.7.0", "cli-table": "^0.3.4", "js-yaml": "^4.0.0", "mongodb": "^6.6.1", "mongodb-ns": "^2.4.0", "numeral": "^2.0.6", "progress": "^2.0.3", "stats-lite": "^2.0.0", "yargs": "^17.6.2" }, "bin": { "mongodb-schema": "bin/mongodb-schema" } }, "sha512-uKjkTAx6MqJi0Xj0aeYRjvYr3O7LrUQgXH1c0WQCOByPoYbNG9RAhWoc4IwriIqTHyBw1RJn0C/p7DISOPYpMg=="], - - "moo": ["moo@0.5.2", "", {}, "sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q=="], - - "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], - - "msgpackr": ["msgpackr@1.11.4", "", { "optionalDependencies": { "msgpackr-extract": "^3.0.2" } }, "sha512-uaff7RG9VIC4jacFW9xzL3jc0iM32DNHe4jYVycBcjUePT/Klnfj7pqtWJt9khvDFizmjN2TlYniYmSS2LIaZg=="], - - "msgpackr-extract": ["msgpackr-extract@3.0.3", "", { "dependencies": { "node-gyp-build-optional-packages": "5.2.2" }, "optionalDependencies": { "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.3", "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.3", "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.3", "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.3", "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.3", "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.3" }, "bin": { "download-msgpackr-prebuilds": "bin/download-prebuilds.js" } }, "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA=="], - - "mz": ["mz@2.7.0", "", { "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", "thenify-all": "^1.0.0" } }, "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q=="], - - "nan": ["nan@2.22.2", "", {}, "sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ=="], - - "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], - - "napi-build-utils": ["napi-build-utils@1.0.2", "", {}, "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg=="], - - "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], - - "nearley": ["nearley@2.20.1", "", { "dependencies": { "commander": "^2.19.0", "moo": "^0.5.0", "railroad-diagrams": "^1.0.0", "randexp": "0.4.6" }, "bin": { "nearleyc": "bin/nearleyc.js", "nearley-test": "bin/nearley-test.js", "nearley-unparse": "bin/nearley-unparse.js", "nearley-railroad": "bin/nearley-railroad.js" } }, "sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ=="], - - "negotiator": ["negotiator@0.6.3", "", {}, "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="], - - "neo-async": ["neo-async@2.6.2", "", {}, "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="], - - "netmask": ["netmask@2.0.2", "", {}, "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg=="], - - "new-find-package-json": ["new-find-package-json@2.0.0", "", { "dependencies": { "debug": "^4.3.4" } }, "sha512-lDcBsjBSMlj3LXH2v/FW3txlh2pYTjmbOXPYJD93HI5EwuLzI11tdHSIpUMmfq/IOsldj4Ps8M8flhm+pCK4Ew=="], - - "no-case": ["no-case@3.0.4", "", { "dependencies": { "lower-case": "^2.0.2", "tslib": "^2.0.3" } }, "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg=="], - - "node-abi": ["node-abi@3.75.0", "", { "dependencies": { "semver": "^7.3.5" } }, "sha512-OhYaY5sDsIka7H7AtijtI9jwGYLyl29eQn/W623DiN/MIv5sUqc4g7BIDThX+gb7di9f6xK02nkp8sdfFWZLTg=="], - - "node-abort-controller": ["node-abort-controller@3.1.1", "", {}, "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ=="], - - "node-addon-api": ["node-addon-api@6.1.0", "", {}, "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA=="], - - "node-domexception": ["node-domexception@1.0.0", "", {}, "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ=="], - - "node-fetch": ["node-fetch@3.3.2", "", { "dependencies": { "data-uri-to-buffer": "^4.0.0", "fetch-blob": "^3.1.4", "formdata-polyfill": "^4.0.10" } }, "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA=="], - - "node-gyp-build-optional-packages": ["node-gyp-build-optional-packages@5.2.2", "", { "dependencies": { "detect-libc": "^2.0.1" }, "bin": { "node-gyp-build-optional-packages": "bin.js", "node-gyp-build-optional-packages-optional": "optional.js", "node-gyp-build-optional-packages-test": "build-test.js" } }, "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw=="], - - "node-machine-id": ["node-machine-id@1.1.12", "", {}, "sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ=="], - - "node-releases": ["node-releases@2.0.19", "", {}, "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw=="], - - "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], - - "normalize-range": ["normalize-range@0.1.2", "", {}, "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA=="], - - "normalize-url": ["normalize-url@8.0.2", "", {}, "sha512-Ee/R3SyN4BuynXcnTaekmaVdbDAEiNrHqjQIA37mHU8G9pf7aaAD4ZX3XjBLo6rsdcxA/gtkcNYZLt30ACgynw=="], - - "npm-run-path": ["npm-run-path@5.3.0", "", { "dependencies": { "path-key": "^4.0.0" } }, "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ=="], - - "numeral": ["numeral@2.0.6", "", {}, "sha512-qaKRmtYPZ5qdw4jWJD6bxEf1FJEqllJrwxCLIm0sQU/A7v2/czigzOb+C2uSiFsa9lBUzeH7M1oK+Q+OLxL3kA=="], - - "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], - - "object-hash": ["object-hash@2.2.0", "", {}, "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw=="], - - "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="], - - "object-keys": ["object-keys@1.1.1", "", {}, "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="], - - "object.assign": ["object.assign@4.1.7", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0", "has-symbols": "^1.1.0", "object-keys": "^1.1.1" } }, "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw=="], - - "object.entries": ["object.entries@1.1.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-object-atoms": "^1.1.1" } }, "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw=="], - - "object.fromentries": ["object.fromentries@2.0.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-object-atoms": "^1.0.0" } }, "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ=="], - - "object.groupby": ["object.groupby@1.0.3", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2" } }, "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ=="], - - "object.values": ["object.values@1.2.1", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA=="], - - "oidc-token-hash": ["oidc-token-hash@5.1.0", "", {}, "sha512-y0W+X7Ppo7oZX6eovsRkuzcSM40Bicg2JEJkDJ4irIt1wsYAP5MLSNv+QAogO8xivMffw/9OvV3um1pxXgt1uA=="], - - "on-exit-leak-free": ["on-exit-leak-free@2.1.2", "", {}, "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA=="], - - "on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="], - - "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], - - "onetime": ["onetime@6.0.0", "", { "dependencies": { "mimic-fn": "^4.0.0" } }, "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ=="], - - "open": ["open@9.1.0", "", { "dependencies": { "default-browser": "^4.0.0", "define-lazy-prop": "^3.0.0", "is-inside-container": "^1.0.0", "is-wsl": "^2.2.0" } }, "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg=="], - - "openapi-fetch": ["openapi-fetch@0.13.8", "", { "dependencies": { "openapi-typescript-helpers": "^0.0.15" } }, "sha512-yJ4QKRyNxE44baQ9mY5+r/kAzZ8yXMemtNAOFwOzRXJscdjSxxzWSNlyBAr+o5JjkUw9Lc3W7OIoca0cY3PYnQ=="], - - "openapi-typescript-helpers": ["openapi-typescript-helpers@0.0.15", "", {}, "sha512-opyTPaunsklCBpTK8JGef6mfPhLSnyy5a0IN9vKtx3+4aExf+KxEqYwIy3hqkedXIB97u357uLMJsOnm3GVjsw=="], - - "openid-client": ["openid-client@5.7.1", "", { "dependencies": { "jose": "^4.15.9", "lru-cache": "^6.0.0", "object-hash": "^2.2.0", "oidc-token-hash": "^5.0.3" } }, "sha512-jDBPgSVfTnkIh71Hg9pRvtJc6wTwqjRkN88+gCFtYWrlP4Yx2Dsrow8uPi3qLr/aeymPF3o2+dS+wOpglK04ew=="], - - "optionator": ["optionator@0.9.4", "", { "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.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="], - - "os-dns-native": ["os-dns-native@1.2.1", "", { "dependencies": { "bindings": "^1.5.0", "debug": "^4.3.3", "ipv6-normalize": "^1.0.1", "node-addon-api": "^4.3.0" } }, "sha512-LbU43lWBxnZhy72Ngr+Vga0og5Q2+Ob8lvSHJkP2uYBkvdmAnK4CvaVaBhC1hk9AQV3YxAZ9fZWaJTuIyPEi+Q=="], - - "own-keys": ["own-keys@1.0.1", "", { "dependencies": { "get-intrinsic": "^1.2.6", "object-keys": "^1.1.1", "safe-push-apply": "^1.0.0" } }, "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg=="], - - "oxc-resolver": ["oxc-resolver@11.2.0", "", { "optionalDependencies": { "@oxc-resolver/binding-darwin-arm64": "11.2.0", "@oxc-resolver/binding-darwin-x64": "11.2.0", "@oxc-resolver/binding-freebsd-x64": "11.2.0", "@oxc-resolver/binding-linux-arm-gnueabihf": "11.2.0", "@oxc-resolver/binding-linux-arm64-gnu": "11.2.0", "@oxc-resolver/binding-linux-arm64-musl": "11.2.0", "@oxc-resolver/binding-linux-riscv64-gnu": "11.2.0", "@oxc-resolver/binding-linux-s390x-gnu": "11.2.0", "@oxc-resolver/binding-linux-x64-gnu": "11.2.0", "@oxc-resolver/binding-linux-x64-musl": "11.2.0", "@oxc-resolver/binding-wasm32-wasi": "11.2.0", "@oxc-resolver/binding-win32-arm64-msvc": "11.2.0", "@oxc-resolver/binding-win32-x64-msvc": "11.2.0" } }, "sha512-3iJYyIdDZMDoj0ZSVBrI1gUvPBMkDC4gxonBG+7uqUyK5EslG0mCwnf6qhxK8oEU7jLHjbRBNyzflPSd3uvH7Q=="], - - "p-cancelable": ["p-cancelable@4.0.1", "", {}, "sha512-wBowNApzd45EIKdO1LaU+LrMBwAcjfPaYtVzV3lmfM3gf8Z4CHZsiIqlM8TZZ8okYvh5A1cP6gTfCRQtwUpaUg=="], - - "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], - - "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], - - "p-try": ["p-try@2.2.0", "", {}, "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="], - - "pac-proxy-agent": ["pac-proxy-agent@7.2.0", "", { "dependencies": { "@tootallnate/quickjs-emscripten": "^0.23.0", "agent-base": "^7.1.2", "debug": "^4.3.4", "get-uri": "^6.0.1", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.6", "pac-resolver": "^7.0.1", "socks-proxy-agent": "^8.0.5" } }, "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA=="], - - "pac-resolver": ["pac-resolver@7.0.1", "", { "dependencies": { "degenerator": "^5.0.0", "netmask": "^2.0.2" } }, "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg=="], - - "package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="], - - "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], - - "parseurl": ["parseurl@1.3.3", "", {}, "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="], - - "pascal-case": ["pascal-case@3.1.2", "", { "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g=="], - - "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], - - "path-is-absolute": ["path-is-absolute@1.0.1", "", {}, "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="], - - "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], - - "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], - - "path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], - - "path-to-regexp": ["path-to-regexp@8.2.0", "", {}, "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ=="], - - "path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="], - - "pend": ["pend@1.2.0", "", {}, "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg=="], - - "pg": ["pg@8.16.2", "", { "dependencies": { "pg-connection-string": "^2.9.1", "pg-pool": "^3.10.1", "pg-protocol": "^1.10.2", "pg-types": "2.2.0", "pgpass": "1.0.5" }, "optionalDependencies": { "pg-cloudflare": "^1.2.6" }, "peerDependencies": { "pg-native": ">=3.0.1" }, "optionalPeers": ["pg-native"] }, "sha512-OtLWF0mKLmpxelOt9BqVq83QV6bTfsS0XLegIeAKqKjurRnRKie1Dc1iL89MugmSLhftxw6NNCyZhm1yQFLMEQ=="], - - "pg-cloudflare": ["pg-cloudflare@1.2.6", "", {}, "sha512-uxmJAnmIgmYgnSFzgOf2cqGQBzwnRYcrEgXuFjJNEkpedEIPBSEzxY7ph4uA9k1mI+l/GR0HjPNS6FKNZe8SBQ=="], - - "pg-connection-string": ["pg-connection-string@2.9.1", "", {}, "sha512-nkc6NpDcvPVpZXxrreI/FOtX3XemeLl8E0qFr6F2Lrm/I8WOnaWNhIPK2Z7OHpw7gh5XJThi6j6ppgNoaT1w4w=="], - - "pg-int8": ["pg-int8@1.0.1", "", {}, "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw=="], - - "pg-mem": ["pg-mem@2.9.1", "", { "dependencies": { "functional-red-black-tree": "^1.0.1", "immutable": "^4.3.4", "json-stable-stringify": "^1.0.1", "lru-cache": "^6.0.0", "moment": "^2.27.0", "object-hash": "^2.0.3", "pgsql-ast-parser": "^12.0.1" }, "peerDependencies": { "@mikro-orm/core": ">=4.5.3", "@mikro-orm/postgresql": ">=4.5.3", "knex": ">=0.20", "kysely": ">=0.26", "pg-promise": ">=10.8.7", "slonik": ">=23.0.1", "typeorm": ">=0.2.29" }, "optionalPeers": ["@mikro-orm/core", "@mikro-orm/postgresql", "knex", "kysely", "pg-promise", "slonik", "typeorm"] }, "sha512-OYq8vde7qwvAWGCEtIjkBu6zScGYD8hp3ldDIzVgQa1vtuU8ymWww/4fvcgLuFMmDl0r3NX+ZOCw254+/cLdAA=="], - - "pg-pool": ["pg-pool@3.10.1", "", { "peerDependencies": { "pg": ">=8.0" } }, "sha512-Tu8jMlcX+9d8+QVzKIvM/uJtp07PKr82IUOYEphaWcoBhIYkoHpLXN3qO59nAI11ripznDsEzEv8nUxBVWajGg=="], - - "pg-protocol": ["pg-protocol@1.10.2", "", {}, "sha512-Ci7jy8PbaWxfsck2dwZdERcDG2A0MG8JoQILs+uZNjABFuBuItAZCWUNz8sXRDMoui24rJw7WlXqgpMdBSN/vQ=="], - - "pg-types": ["pg-types@2.2.0", "", { "dependencies": { "pg-int8": "1.0.1", "postgres-array": "~2.0.0", "postgres-bytea": "~1.0.0", "postgres-date": "~1.0.4", "postgres-interval": "^1.1.0" } }, "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA=="], - - "pgpass": ["pgpass@1.0.5", "", { "dependencies": { "split2": "^4.1.0" } }, "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug=="], - - "pgsql-ast-parser": ["pgsql-ast-parser@12.0.1", "", { "dependencies": { "moo": "^0.5.1", "nearley": "^2.19.5" } }, "sha512-pe8C6Zh5MsS+o38WlSu18NhrTjAv1UNMeDTs2/Km2ZReZdYBYtwtbWGZKK2BM2izv5CrQpbmP0oI10wvHOwv4A=="], - - "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], - - "picomatch": ["picomatch@4.0.2", "", {}, "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="], - - "pify": ["pify@2.3.0", "", {}, "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog=="], - - "pino": ["pino@9.7.0", "", { "dependencies": { "atomic-sleep": "^1.0.0", "fast-redact": "^3.1.1", "on-exit-leak-free": "^2.1.0", "pino-abstract-transport": "^2.0.0", "pino-std-serializers": "^7.0.0", "process-warning": "^5.0.0", "quick-format-unescaped": "^4.0.3", "real-require": "^0.2.0", "safe-stable-stringify": "^2.3.1", "sonic-boom": "^4.0.1", "thread-stream": "^3.0.0" }, "bin": { "pino": "bin.js" } }, "sha512-vnMCM6xZTb1WDmLvtG2lE/2p+t9hDEIvTWJsu6FejkE62vB7gDhvzrpFR4Cw2to+9JNQxVnkAKVPA1KPB98vWg=="], - - "pino-abstract-transport": ["pino-abstract-transport@2.0.0", "", { "dependencies": { "split2": "^4.0.0" } }, "sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw=="], - - "pino-loki": ["pino-loki@2.6.0", "", { "dependencies": { "pino-abstract-transport": "^2.0.0", "pump": "^3.0.2" }, "bin": { "pino-loki": "dist/cli.js" } }, "sha512-Qy+NeIdb0YmZe/M5mgnO5aGaAyVaeqgwn45T6VajhRXZlZVfGe1YNYhFa9UZyCeNFAPGaUkD2e9yPGjx+2BBYA=="], - - "pino-pretty": ["pino-pretty@13.0.0", "", { "dependencies": { "colorette": "^2.0.7", "dateformat": "^4.6.3", "fast-copy": "^3.0.2", "fast-safe-stringify": "^2.1.1", "help-me": "^5.0.0", "joycon": "^3.1.1", "minimist": "^1.2.6", "on-exit-leak-free": "^2.1.0", "pino-abstract-transport": "^2.0.0", "pump": "^3.0.0", "secure-json-parse": "^2.4.0", "sonic-boom": "^4.0.1", "strip-json-comments": "^3.1.1" }, "bin": { "pino-pretty": "bin.js" } }, "sha512-cQBBIVG3YajgoUjo1FdKVRX6t9XPxwB9lcNJVD5GCnNM4Y6T12YYx8c6zEejxQsU0wrg9TwmDulcE9LR7qcJqA=="], - - "pino-std-serializers": ["pino-std-serializers@7.0.0", "", {}, "sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA=="], - - "pirates": ["pirates@4.0.7", "", {}, "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA=="], - - "pkce-challenge": ["pkce-challenge@5.0.0", "", {}, "sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ=="], - - "pkg-dir": ["pkg-dir@4.2.0", "", { "dependencies": { "find-up": "^4.0.0" } }, "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ=="], - - "playwright": ["playwright@1.53.1", "", { "dependencies": { "playwright-core": "1.53.1" }, "optionalDependencies": { "fsevents": "2.3.2" }, "bin": { "playwright": "cli.js" } }, "sha512-LJ13YLr/ocweuwxyGf1XNFWIU4M2zUSo149Qbp+A4cpwDjsxRPj7k6H25LBrEHiEwxvRbD8HdwvQmRMSvquhYw=="], - - "playwright-core": ["playwright-core@1.53.1", "", { "bin": { "playwright-core": "cli.js" } }, "sha512-Z46Oq7tLAyT0lGoFx4DOuB1IA9D1TPj0QkYxpPVUnGDqHHvDpCftu1J2hM2PiWsNMoZh8+LQaarAWcDfPBc6zg=="], - - "possible-typed-array-names": ["possible-typed-array-names@1.1.0", "", {}, "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg=="], - - "postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="], - - "postcss-import": ["postcss-import@15.1.0", "", { "dependencies": { "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", "resolve": "^1.1.7" }, "peerDependencies": { "postcss": "^8.0.0" } }, "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew=="], - - "postcss-js": ["postcss-js@4.0.1", "", { "dependencies": { "camelcase-css": "^2.0.1" }, "peerDependencies": { "postcss": "^8.4.21" } }, "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw=="], - - "postcss-load-config": ["postcss-load-config@4.0.2", "", { "dependencies": { "lilconfig": "^3.0.0", "yaml": "^2.3.4" }, "peerDependencies": { "postcss": ">=8.0.9", "ts-node": ">=9.0.0" }, "optionalPeers": ["postcss", "ts-node"] }, "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ=="], - - "postcss-nested": ["postcss-nested@6.2.0", "", { "dependencies": { "postcss-selector-parser": "^6.1.1" }, "peerDependencies": { "postcss": "^8.2.14" } }, "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ=="], - - "postcss-selector-parser": ["postcss-selector-parser@6.1.2", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg=="], - - "postcss-value-parser": ["postcss-value-parser@4.2.0", "", {}, "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="], - - "postgres-array": ["postgres-array@2.0.0", "", {}, "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA=="], - - "postgres-bytea": ["postgres-bytea@1.0.0", "", {}, "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w=="], - - "postgres-date": ["postgres-date@1.0.7", "", {}, "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q=="], - - "postgres-interval": ["postgres-interval@1.2.0", "", { "dependencies": { "xtend": "^4.0.0" } }, "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ=="], - - "prebuild-install": ["prebuild-install@7.1.1", "", { "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", "pump": "^3.0.0", "rc": "^1.2.7", "simple-get": "^4.0.0", "tar-fs": "^2.0.0", "tunnel-agent": "^0.6.0" }, "bin": { "prebuild-install": "bin.js" } }, "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw=="], - - "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], - - "prettier": ["prettier@3.5.3", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw=="], - - "process": ["process@0.11.10", "", {}, "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A=="], - - "process-nextick-args": ["process-nextick-args@2.0.1", "", {}, "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="], - - "process-warning": ["process-warning@5.0.0", "", {}, "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA=="], - - "progress": ["progress@2.0.3", "", {}, "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA=="], - - "prop-types": ["prop-types@15.8.1", "", { "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.13.1" } }, "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg=="], - - "proper-lockfile": ["proper-lockfile@4.1.2", "", { "dependencies": { "graceful-fs": "^4.2.4", "retry": "^0.12.0", "signal-exit": "^3.0.2" } }, "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA=="], - - "properties-reader": ["properties-reader@2.3.0", "", { "dependencies": { "mkdirp": "^1.0.4" } }, "sha512-z597WicA7nDZxK12kZqHr2TcvwNU1GCfA5UwfDY/HDp3hXPoPlb5rlEx9bwGTiJnc0OqbBTkU975jDToth8Gxw=="], - - "property-expr": ["property-expr@2.0.6", "", {}, "sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA=="], - - "protobufjs": ["protobufjs@7.5.3", "", { "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/node": ">=13.7.0", "long": "^5.0.0" } }, "sha512-sildjKwVqOI2kmFDiXQ6aEB0fjYTafpEvIBs8tOR8qI4spuL9OPROLVu2qZqi/xgCfsHIwVqlaF8JBjWFHnKbw=="], - - "proxy-addr": ["proxy-addr@2.0.7", "", { "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg=="], - - "proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="], - - "pump": ["pump@3.0.3", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA=="], - - "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], - - "qs": ["qs@6.14.0", "", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w=="], - - "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], - - "quick-format-unescaped": ["quick-format-unescaped@4.0.4", "", {}, "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg=="], - - "quick-lru": ["quick-lru@5.1.1", "", {}, "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA=="], - - "railroad-diagrams": ["railroad-diagrams@1.0.0", "", {}, "sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A=="], - - "randexp": ["randexp@0.4.6", "", { "dependencies": { "discontinuous-range": "1.0.0", "ret": "~0.1.10" } }, "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ=="], - - "range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="], - - "rate-limiter-flexible": ["rate-limiter-flexible@3.0.6", "", {}, "sha512-tlvbee6lyse/XTWmsuBDS4MT8N65FyM151bPmQlFyfhv9+RIHs7d3rSTXoz0j35H910dM01mH0yTIeWYo8+aAw=="], - - "raw-body": ["raw-body@3.0.0", "", { "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", "iconv-lite": "0.6.3", "unpipe": "1.0.0" } }, "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g=="], - - "rc": ["rc@1.2.8", "", { "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" }, "bin": { "rc": "./cli.js" } }, "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw=="], - - "react": ["react@18.3.1", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ=="], - - "react-dom": ["react-dom@18.3.1", "", { "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" }, "peerDependencies": { "react": "^18.3.1" } }, "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw=="], - - "react-hook-form": ["react-hook-form@7.59.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17 || ^18 || ^19" } }, "sha512-kmkek2/8grqarTJExFNjy+RXDIP8yM+QTl3QL6m6Q8b2bih4ltmiXxH7T9n+yXNK477xPh5yZT/6vD8sYGzJTA=="], - - "react-is": ["react-is@18.3.1", "", {}, "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="], - - "react-refresh": ["react-refresh@0.17.0", "", {}, "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ=="], - - "react-router": ["react-router@7.6.2", "", { "dependencies": { "cookie": "^1.0.1", "set-cookie-parser": "^2.6.0" }, "peerDependencies": { "react": ">=18", "react-dom": ">=18" }, "optionalPeers": ["react-dom"] }, "sha512-U7Nv3y+bMimgWjhlT5CRdzHPu2/KVmqPwKUCChW8en5P3znxUqwlYFlbmyj8Rgp1SF6zs5X4+77kBVknkg6a0w=="], - - "react-router-dom": ["react-router-dom@7.6.2", "", { "dependencies": { "react-router": "7.6.2" }, "peerDependencies": { "react": ">=18", "react-dom": ">=18" } }, "sha512-Q8zb6VlTbdYKK5JJBLQEN06oTUa/RAbG/oQS1auK1I0TbJOXktqm+QENEVJU6QvWynlXPRBXI3fiOQcSEA78rA=="], - - "react-smooth": ["react-smooth@4.0.4", "", { "dependencies": { "fast-equals": "^5.0.1", "prop-types": "^15.8.1", "react-transition-group": "^4.4.5" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-gnGKTpYwqL0Iii09gHobNolvX4Kiq4PKx6eWBCYYix+8cdw+cGo3do906l1NBPKkSWx1DghC1dlWG9L2uGd61Q=="], - - "react-transition-group": ["react-transition-group@4.4.5", "", { "dependencies": { "@babel/runtime": "^7.5.5", "dom-helpers": "^5.0.1", "loose-envify": "^1.4.0", "prop-types": "^15.6.2" }, "peerDependencies": { "react": ">=16.6.0", "react-dom": ">=16.6.0" } }, "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g=="], - - "react-virtuoso": ["react-virtuoso@4.13.0", "", { "peerDependencies": { "react": ">=16 || >=17 || >= 18 || >= 19", "react-dom": ">=16 || >=17 || >= 18 || >=19" } }, "sha512-XHv2Fglpx80yFPdjZkV9d1baACKghg/ucpDFEXwaix7z0AfVQj+mF6lM+YQR6UC/TwzXG2rJKydRMb3+7iV3PA=="], - - "read-cache": ["read-cache@1.0.0", "", { "dependencies": { "pify": "^2.3.0" } }, "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA=="], - - "readable-stream": ["readable-stream@4.7.0", "", { "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", "events": "^3.3.0", "process": "^0.11.10", "string_decoder": "^1.3.0" } }, "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg=="], - - "readdir-glob": ["readdir-glob@1.1.3", "", { "dependencies": { "minimatch": "^5.1.0" } }, "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA=="], - - "readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="], - - "real-require": ["real-require@0.2.0", "", {}, "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg=="], - - "recharts": ["recharts@2.15.4", "", { "dependencies": { "clsx": "^2.0.0", "eventemitter3": "^4.0.1", "lodash": "^4.17.21", "react-is": "^18.3.1", "react-smooth": "^4.0.4", "recharts-scale": "^0.4.4", "tiny-invariant": "^1.3.1", "victory-vendor": "^36.6.8" }, "peerDependencies": { "react": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-UT/q6fwS3c1dHbXv2uFgYJ9BMFHu3fwnd7AYZaEQhXuYQ4hgsxLvsUXzGdKeZrW5xopzDCvuA2N41WJ88I7zIw=="], - - "recharts-scale": ["recharts-scale@0.4.5", "", { "dependencies": { "decimal.js-light": "^2.4.1" } }, "sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w=="], - - "redis-errors": ["redis-errors@1.2.0", "", {}, "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w=="], - - "redis-parser": ["redis-parser@3.0.0", "", { "dependencies": { "redis-errors": "^1.0.0" } }, "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A=="], - - "reflect.getprototypeof": ["reflect.getprototypeof@1.0.10", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.9", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.7", "get-proto": "^1.0.1", "which-builtin-type": "^1.2.1" } }, "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw=="], - - "regexp.prototype.flags": ["regexp.prototype.flags@1.5.4", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-errors": "^1.3.0", "get-proto": "^1.0.1", "gopd": "^1.2.0", "set-function-name": "^2.0.2" } }, "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA=="], - - "regexpp": ["regexpp@3.2.0", "", {}, "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg=="], - - "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], - - "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="], - - "reservoir": ["reservoir@0.1.2", "", {}, "sha512-ysyw95gLBhMAzqIVrOHJ2yMrRQHAS+h97bS9r89Z7Ou10Jhl2k5KOsyjPqrxL+WfEanov0o5bAMVzQ7AKyENHA=="], - - "resolve": ["resolve@1.22.10", "", { "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w=="], - - "resolve-alpn": ["resolve-alpn@1.2.1", "", {}, "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g=="], - - "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], - - "resolve-mongodb-srv": ["resolve-mongodb-srv@1.1.5", "", { "dependencies": { "whatwg-url": "^11.0.0 || ^12.0.0 || ^13.0.0 || ^14.0.0" }, "bin": { "resolve-mongodb-srv": "bin/resolve-mongodb-srv.js" } }, "sha512-flu1XTSLDJHvTnWu2aJh2w9jgGPcNYJn2obMkuzXiyWSz0MLXu9IRCjvirJ4zRoCPHJJPt3uLQVNJTrzFRWd1w=="], - - "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], - - "responselike": ["responselike@3.0.0", "", { "dependencies": { "lowercase-keys": "^3.0.0" } }, "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg=="], - - "ret": ["ret@0.1.15", "", {}, "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg=="], - - "retry": ["retry@0.12.0", "", {}, "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow=="], - - "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], - - "rimraf": ["rimraf@3.0.2", "", { "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "bin.js" } }, "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA=="], - - "rollup": ["rollup@3.29.5", "", { "optionalDependencies": { "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w=="], - - "router": ["router@2.2.0", "", { "dependencies": { "debug": "^4.4.0", "depd": "^2.0.0", "is-promise": "^4.0.0", "parseurl": "^1.3.3", "path-to-regexp": "^8.0.0" } }, "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ=="], - - "run-applescript": ["run-applescript@5.0.0", "", { "dependencies": { "execa": "^5.0.0" } }, "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg=="], - - "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], - - "safe-array-concat": ["safe-array-concat@1.1.3", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "has-symbols": "^1.1.0", "isarray": "^2.0.5" } }, "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q=="], - - "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], - - "safe-push-apply": ["safe-push-apply@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "isarray": "^2.0.5" } }, "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA=="], - - "safe-regex-test": ["safe-regex-test@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-regex": "^1.2.1" } }, "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw=="], - - "safe-stable-stringify": ["safe-stable-stringify@2.5.0", "", {}, "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA=="], - - "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], - - "scheduler": ["scheduler@0.23.2", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ=="], - - "secure-json-parse": ["secure-json-parse@2.7.0", "", {}, "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw=="], - - "semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], - - "send": ["send@1.2.0", "", { "dependencies": { "debug": "^4.3.5", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "fresh": "^2.0.0", "http-errors": "^2.0.0", "mime-types": "^3.0.1", "ms": "^2.1.3", "on-finished": "^2.4.1", "range-parser": "^1.2.1", "statuses": "^2.0.1" } }, "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw=="], - - "serve-static": ["serve-static@2.2.0", "", { "dependencies": { "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "parseurl": "^1.3.3", "send": "^1.2.0" } }, "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ=="], - - "set-cookie-parser": ["set-cookie-parser@2.7.1", "", {}, "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ=="], - - "set-function-length": ["set-function-length@1.2.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2" } }, "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg=="], - - "set-function-name": ["set-function-name@2.0.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", "has-property-descriptors": "^1.0.2" } }, "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ=="], - - "set-proto": ["set-proto@1.0.0", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0" } }, "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw=="], - - "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="], - - "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], - - "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], - - "side-channel": ["side-channel@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="], - - "side-channel-list": ["side-channel-list@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" } }, "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA=="], - - "side-channel-map": ["side-channel-map@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3" } }, "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA=="], - - "side-channel-weakmap": ["side-channel-weakmap@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="], - - "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], - - "simple-concat": ["simple-concat@1.0.1", "", {}, "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q=="], - - "simple-get": ["simple-get@4.0.1", "", { "dependencies": { "decompress-response": "^6.0.0", "once": "^1.3.1", "simple-concat": "^1.0.0" } }, "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA=="], - - "simple-oauth2": ["simple-oauth2@5.1.0", "", { "dependencies": { "@hapi/hoek": "^11.0.4", "@hapi/wreck": "^18.0.0", "debug": "^4.3.4", "joi": "^17.6.4" } }, "sha512-gWDa38Ccm4MwlG5U7AlcJxPv3lvr80dU7ARJWrGdgvOKyzSj1gr3GBPN1rABTedAYvC/LsGYoFuFxwDBPtGEbw=="], - - "simple-statistics": ["simple-statistics@7.8.8", "", {}, "sha512-CUtP0+uZbcbsFpqEyvNDYjJCl+612fNgjT8GaVuvMG7tBuJg8gXGpsP5M7X658zy0IcepWOZ6nPBu1Qb9ezA1w=="], - - "slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="], - - "slice-ansi": ["slice-ansi@4.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", "is-fullwidth-code-point": "^3.0.0" } }, "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ=="], - - "smart-buffer": ["smart-buffer@4.2.0", "", {}, "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg=="], - - "smol-toml": ["smol-toml@1.3.4", "", {}, "sha512-UOPtVuYkzYGee0Bd2Szz8d2G3RfMfJ2t3qVdZUAozZyAk+a0Sxa+QKix0YCwjL/A1RR0ar44nCxaoN9FxdJGwA=="], - - "socket.io": ["socket.io@4.8.1", "", { "dependencies": { "accepts": "~1.3.4", "base64id": "~2.0.0", "cors": "~2.8.5", "debug": "~4.3.2", "engine.io": "~6.6.0", "socket.io-adapter": "~2.5.2", "socket.io-parser": "~4.2.4" } }, "sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg=="], - - "socket.io-adapter": ["socket.io-adapter@2.5.5", "", { "dependencies": { "debug": "~4.3.4", "ws": "~8.17.1" } }, "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg=="], - - "socket.io-client": ["socket.io-client@4.8.1", "", { "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.2", "engine.io-client": "~6.6.1", "socket.io-parser": "~4.2.4" } }, "sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ=="], - - "socket.io-parser": ["socket.io-parser@4.2.4", "", { "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.1" } }, "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew=="], - - "socks": ["socks@2.8.5", "", { "dependencies": { "ip-address": "^9.0.5", "smart-buffer": "^4.2.0" } }, "sha512-iF+tNDQla22geJdTyJB1wM/qrX9DMRwWrciEPwWLPRWAUEM8sQiyxgckLxWT1f7+9VabJS0jTGGr4QgBuvi6Ww=="], - - "socks-proxy-agent": ["socks-proxy-agent@8.0.5", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "^4.3.4", "socks": "^2.8.3" } }, "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw=="], - - "sonic-boom": ["sonic-boom@4.2.0", "", { "dependencies": { "atomic-sleep": "^1.0.0" } }, "sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww=="], - - "source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], - - "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], - - "sparse-bitfield": ["sparse-bitfield@3.0.3", "", { "dependencies": { "memory-pager": "^1.0.2" } }, "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ=="], - - "split-ca": ["split-ca@1.0.1", "", {}, "sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ=="], - - "split2": ["split2@4.2.0", "", {}, "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg=="], - - "sprintf-js": ["sprintf-js@1.1.3", "", {}, "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA=="], - - "ssh-remote-port-forward": ["ssh-remote-port-forward@1.0.4", "", { "dependencies": { "@types/ssh2": "^0.5.48", "ssh2": "^1.4.0" } }, "sha512-x0LV1eVDwjf1gmG7TTnfqIzf+3VPRz7vrNIjX6oYLbeCrf/PeVY6hkT68Mg+q02qXxQhrLjB0jfgvhevoCRmLQ=="], - - "ssh2": ["ssh2@1.16.0", "", { "dependencies": { "asn1": "^0.2.6", "bcrypt-pbkdf": "^1.0.2" }, "optionalDependencies": { "cpu-features": "~0.0.10", "nan": "^2.20.0" } }, "sha512-r1X4KsBGedJqo7h8F5c4Ybpcr5RjyP+aWIG007uBPRjmdQWfEiVLzSK71Zji1B9sKxwaCvD8y8cwSkYrlLiRRg=="], - - "standard-as-callback": ["standard-as-callback@2.1.0", "", {}, "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A=="], - - "stats-lite": ["stats-lite@2.2.0", "", { "dependencies": { "isnumber": "~1.0.0" } }, "sha512-/Kz55rgUIv2KP2MKphwYT/NCuSfAlbbMRv2ZWw7wyXayu230zdtzhxxuXXcvsc6EmmhS8bSJl3uS1wmMHFumbA=="], - - "statuses": ["statuses@2.0.2", "", {}, "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw=="], - - "stop-iteration-iterator": ["stop-iteration-iterator@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "internal-slot": "^1.1.0" } }, "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ=="], - - "streamx": ["streamx@2.22.1", "", { "dependencies": { "fast-fifo": "^1.3.2", "text-decoder": "^1.1.0" }, "optionalDependencies": { "bare-events": "^2.2.0" } }, "sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA=="], - - "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], - - "string-width-cjs": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], - - "string.prototype.matchall": ["string.prototype.matchall@4.0.12", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-abstract": "^1.23.6", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.6", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "internal-slot": "^1.1.0", "regexp.prototype.flags": "^1.5.3", "set-function-name": "^2.0.2", "side-channel": "^1.1.0" } }, "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA=="], - - "string.prototype.repeat": ["string.prototype.repeat@1.0.0", "", { "dependencies": { "define-properties": "^1.1.3", "es-abstract": "^1.17.5" } }, "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w=="], - - "string.prototype.trim": ["string.prototype.trim@1.2.10", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-data-property": "^1.1.4", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-object-atoms": "^1.0.0", "has-property-descriptors": "^1.0.2" } }, "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA=="], - - "string.prototype.trimend": ["string.prototype.trimend@1.0.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ=="], - - "string.prototype.trimstart": ["string.prototype.trimstart@1.0.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg=="], - - "string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], - - "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - - "strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - - "strip-bom": ["strip-bom@3.0.0", "", {}, "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA=="], - - "strip-final-newline": ["strip-final-newline@3.0.0", "", {}, "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw=="], - - "strip-json-comments": ["strip-json-comments@5.0.2", "", {}, "sha512-4X2FR3UwhNUE9G49aIsJW5hRRR3GXGTBTZRMfv568O60ojM8HcWjV/VxAxCDW3SUND33O6ZY66ZuRcdkj73q2g=="], - - "strnum": ["strnum@1.1.2", "", {}, "sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA=="], - - "sucrase": ["sucrase@3.35.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", "glob": "^10.3.10", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.1", "ts-interface-checker": "^0.1.9" }, "bin": { "sucrase": "bin/sucrase", "sucrase-node": "bin/sucrase-node" } }, "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA=="], - - "superagent": ["superagent@8.1.2", "", { "dependencies": { "component-emitter": "^1.3.0", "cookiejar": "^2.1.4", "debug": "^4.3.4", "fast-safe-stringify": "^2.1.1", "form-data": "^4.0.0", "formidable": "^2.1.2", "methods": "^1.1.2", "mime": "2.6.0", "qs": "^6.11.0", "semver": "^7.3.8" } }, "sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA=="], - - "supertest": ["supertest@6.3.4", "", { "dependencies": { "methods": "^1.1.2", "superagent": "^8.1.2" } }, "sha512-erY3HFDG0dPnhw4U+udPfrzXa4xhSG+n4rxfRuZWCUvjFWwKl+OxWf/7zk50s84/fAAs7vf5QAb9uRa0cCykxw=="], - - "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], - - "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], - - "system-ca": ["system-ca@2.0.1", "", { "optionalDependencies": { "macos-export-certificate-and-key": "^1.2.0", "win-export-certificate-and-key": "^2.1.0" } }, "sha512-9ZDV9yl8ph6Op67wDGPr4LykX86usE9x3le+XZSHfVMiiVJ5IRgmCWjLgxyz35ju9H3GDIJJZm4ogAeIfN5cQQ=="], - - "table": ["table@6.9.0", "", { "dependencies": { "ajv": "^8.0.1", "lodash.truncate": "^4.4.2", "slice-ansi": "^4.0.0", "string-width": "^4.2.3", "strip-ansi": "^6.0.1" } }, "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A=="], - - "tailwind-merge": ["tailwind-merge@3.3.1", "", {}, "sha512-gBXpgUm/3rp1lMZZrM/w7D8GKqshif0zAymAhbCyIt8KMe+0v9DQ7cdYLR4FHH/cKpdTXb+A/tKKU3eolfsI+g=="], - - "tailwindcss": ["tailwindcss@3.4.17", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", "chokidar": "^3.6.0", "didyoumean": "^1.2.2", "dlv": "^1.1.3", "fast-glob": "^3.3.2", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", "jiti": "^1.21.6", "lilconfig": "^3.1.3", "micromatch": "^4.0.8", "normalize-path": "^3.0.0", "object-hash": "^3.0.0", "picocolors": "^1.1.1", "postcss": "^8.4.47", "postcss-import": "^15.1.0", "postcss-js": "^4.0.1", "postcss-load-config": "^4.0.2", "postcss-nested": "^6.2.0", "postcss-selector-parser": "^6.1.2", "resolve": "^1.22.8", "sucrase": "^3.35.0" }, "bin": { "tailwind": "lib/cli.js", "tailwindcss": "lib/cli.js" } }, "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og=="], - - "tar-fs": ["tar-fs@3.0.10", "", { "dependencies": { "pump": "^3.0.0", "tar-stream": "^3.1.5" }, "optionalDependencies": { "bare-fs": "^4.0.1", "bare-path": "^3.0.0" } }, "sha512-C1SwlQGNLe/jPNqapK8epDsXME7CAJR5RL3GcE6KWx1d9OUByzoHVcbu1VPI8tevg9H8Alae0AApHHFGzrD5zA=="], - - "tar-stream": ["tar-stream@3.1.7", "", { "dependencies": { "b4a": "^1.6.4", "fast-fifo": "^1.2.0", "streamx": "^2.15.0" } }, "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ=="], - - "testcontainers": ["testcontainers@10.28.0", "", { "dependencies": { "@balena/dockerignore": "^1.0.2", "@types/dockerode": "^3.3.35", "archiver": "^7.0.1", "async-lock": "^1.4.1", "byline": "^5.0.0", "debug": "^4.3.5", "docker-compose": "^0.24.8", "dockerode": "^4.0.5", "get-port": "^7.1.0", "proper-lockfile": "^4.1.2", "properties-reader": "^2.3.0", "ssh-remote-port-forward": "^1.0.4", "tar-fs": "^3.0.7", "tmp": "^0.2.3", "undici": "^5.29.0" } }, "sha512-1fKrRRCsgAQNkarjHCMKzBKXSJFmzNTiTbhb5E/j5hflRXChEtHvkefjaHlgkNUjfw92/Dq8LTgwQn6RDBFbMg=="], - - "text-decoder": ["text-decoder@1.2.3", "", { "dependencies": { "b4a": "^1.6.4" } }, "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA=="], - - "text-table": ["text-table@0.2.0", "", {}, "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw=="], - - "thenify": ["thenify@3.3.1", "", { "dependencies": { "any-promise": "^1.0.0" } }, "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw=="], - - "thenify-all": ["thenify-all@1.6.0", "", { "dependencies": { "thenify": ">= 3.1.0 < 4" } }, "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA=="], - - "thread-stream": ["thread-stream@3.1.0", "", { "dependencies": { "real-require": "^0.2.0" } }, "sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A=="], - - "tiny-case": ["tiny-case@1.0.3", "", {}, "sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q=="], - - "tiny-invariant": ["tiny-invariant@1.3.3", "", {}, "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg=="], - - "titleize": ["titleize@3.0.0", "", {}, "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ=="], - - "tmp": ["tmp@0.2.3", "", {}, "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w=="], - - "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], - - "toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="], - - "toposort": ["toposort@2.0.2", "", {}, "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg=="], - - "tr46": ["tr46@5.1.1", "", { "dependencies": { "punycode": "^2.3.1" } }, "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw=="], - - "ts-api-utils": ["ts-api-utils@2.1.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ=="], - - "ts-interface-checker": ["ts-interface-checker@0.1.13", "", {}, "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA=="], - - "ts-unused-exports": ["ts-unused-exports@11.0.1", "", { "dependencies": { "chalk": "^4.0.0", "tsconfig-paths": "^3.9.0" }, "peerDependencies": { "typescript": ">=3.8.3" }, "bin": { "ts-unused-exports": "bin/ts-unused-exports" } }, "sha512-b1uIe0B8YfNZjeb+bx62LrB6qaO4CHT8SqMVBkwbwLj7Nh0xQ4J8uV0dS9E6AABId0U4LQ+3yB/HXZBMslGn2A=="], - - "tsconfig-paths": ["tsconfig-paths@3.15.0", "", { "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg=="], - - "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - - "tsx": ["tsx@4.20.3", "", { "dependencies": { "esbuild": "~0.25.0", "get-tsconfig": "^4.7.5" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "bin": { "tsx": "dist/cli.mjs" } }, "sha512-qjbnuR9Tr+FJOMBqJCW5ehvIo/buZq7vH7qD7JziU98h6l3qGy0a/yPFjwO+y0/T7GFpNgNAvEcPPVfyT8rrPQ=="], - - "tunnel-agent": ["tunnel-agent@0.6.0", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w=="], - - "turbo": ["turbo@2.5.4", "", { "optionalDependencies": { "turbo-darwin-64": "2.5.4", "turbo-darwin-arm64": "2.5.4", "turbo-linux-64": "2.5.4", "turbo-linux-arm64": "2.5.4", "turbo-windows-64": "2.5.4", "turbo-windows-arm64": "2.5.4" }, "bin": { "turbo": "bin/turbo" } }, "sha512-kc8ZibdRcuWUG1pbYSBFWqmIjynlD8Lp7IB6U3vIzvOv9VG+6Sp8bzyeBWE3Oi8XV5KsQrznyRTBPvrf99E4mA=="], - - "turbo-darwin-64": ["turbo-darwin-64@2.5.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-ah6YnH2dErojhFooxEzmvsoZQTMImaruZhFPfMKPBq8sb+hALRdvBNLqfc8NWlZq576FkfRZ/MSi4SHvVFT9PQ=="], - - "turbo-darwin-arm64": ["turbo-darwin-arm64@2.5.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-2+Nx6LAyuXw2MdXb7pxqle3MYignLvS7OwtsP9SgtSBaMlnNlxl9BovzqdYAgkUW3AsYiQMJ/wBRb7d+xemM5A=="], - - "turbo-linux-64": ["turbo-linux-64@2.5.4", "", { "os": "linux", "cpu": "x64" }, "sha512-5May2kjWbc8w4XxswGAl74GZ5eM4Gr6IiroqdLhXeXyfvWEdm2mFYCSWOzz0/z5cAgqyGidF1jt1qzUR8hTmOA=="], - - "turbo-linux-arm64": ["turbo-linux-arm64@2.5.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-/2yqFaS3TbfxV3P5yG2JUI79P7OUQKOUvAnx4MV9Bdz6jqHsHwc9WZPpO4QseQm+NvmgY6ICORnoVPODxGUiJg=="], - - "turbo-windows-64": ["turbo-windows-64@2.5.4", "", { "os": "win32", "cpu": "x64" }, "sha512-EQUO4SmaCDhO6zYohxIjJpOKRN3wlfU7jMAj3CgcyTPvQR/UFLEKAYHqJOnJtymbQmiiM/ihX6c6W6Uq0yC7mA=="], - - "turbo-windows-arm64": ["turbo-windows-arm64@2.5.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-oQ8RrK1VS8lrxkLriotFq+PiF7iiGgkZtfLKF4DDKsmdbPo0O9R2mQxm7jHLuXraRCuIQDWMIw6dpcr7Iykf4A=="], - - "tweetnacl": ["tweetnacl@0.14.5", "", {}, "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA=="], - - "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], - - "type-fest": ["type-fest@2.19.0", "", {}, "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA=="], - - "type-is": ["type-is@2.0.1", "", { "dependencies": { "content-type": "^1.0.5", "media-typer": "^1.1.0", "mime-types": "^3.0.0" } }, "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw=="], - - "typed-array-buffer": ["typed-array-buffer@1.0.3", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-typed-array": "^1.1.14" } }, "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw=="], - - "typed-array-byte-length": ["typed-array-byte-length@1.0.3", "", { "dependencies": { "call-bind": "^1.0.8", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-proto": "^1.2.0", "is-typed-array": "^1.1.14" } }, "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg=="], - - "typed-array-byte-offset": ["typed-array-byte-offset@1.0.4", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-proto": "^1.2.0", "is-typed-array": "^1.1.15", "reflect.getprototypeof": "^1.0.9" } }, "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ=="], - - "typed-array-length": ["typed-array-length@1.0.7", "", { "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", "is-typed-array": "^1.1.13", "possible-typed-array-names": "^1.0.0", "reflect.getprototypeof": "^1.0.6" } }, "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg=="], - - "typescript": ["typescript@5.8.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="], - - "uglify-js": ["uglify-js@3.19.3", "", { "bin": { "uglifyjs": "bin/uglifyjs" } }, "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ=="], - - "unbox-primitive": ["unbox-primitive@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "has-bigints": "^1.0.2", "has-symbols": "^1.1.0", "which-boxed-primitive": "^1.1.1" } }, "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw=="], - - "undici": ["undici@5.29.0", "", { "dependencies": { "@fastify/busboy": "^2.0.0" } }, "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg=="], - - "undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], - - "unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="], - - "untildify": ["untildify@4.0.0", "", {}, "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw=="], - - "update-browserslist-db": ["update-browserslist-db@1.1.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw=="], - - "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], - - "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], - - "utils-merge": ["utils-merge@1.0.1", "", {}, "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA=="], - - "uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="], - - "vary": ["vary@1.1.2", "", {}, "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="], - - "victory-vendor": ["victory-vendor@36.9.2", "", { "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" } }, "sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ=="], - - "vite": ["vite@4.5.14", "", { "dependencies": { "esbuild": "^0.18.10", "postcss": "^8.4.27", "rollup": "^3.27.1" }, "optionalDependencies": { "fsevents": "~2.3.2" }, "peerDependencies": { "@types/node": ">= 14", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "stylus": "*", "sugarss": "*", "terser": "^5.4.0" }, "optionalPeers": ["@types/node", "less", "lightningcss", "sass", "stylus", "sugarss", "terser"], "bin": { "vite": "bin/vite.js" } }, "sha512-+v57oAaoYNnO3hIu5Z/tJRZjq5aHM2zDve9YZ8HngVHbhk66RStobhb1sqPMIPEleV6cNKYK4eGrAbE9Ulbl2g=="], - - "walk-up-path": ["walk-up-path@4.0.0", "", {}, "sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A=="], - - "web-streams-polyfill": ["web-streams-polyfill@3.3.3", "", {}, "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw=="], - - "webidl-conversions": ["webidl-conversions@7.0.0", "", {}, "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g=="], - - "whatwg-url": ["whatwg-url@14.2.0", "", { "dependencies": { "tr46": "^5.1.0", "webidl-conversions": "^7.0.0" } }, "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw=="], - - "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], - - "which-boxed-primitive": ["which-boxed-primitive@1.1.1", "", { "dependencies": { "is-bigint": "^1.1.0", "is-boolean-object": "^1.2.1", "is-number-object": "^1.1.1", "is-string": "^1.1.1", "is-symbol": "^1.1.1" } }, "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA=="], - - "which-builtin-type": ["which-builtin-type@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "function.prototype.name": "^1.1.6", "has-tostringtag": "^1.0.2", "is-async-function": "^2.0.0", "is-date-object": "^1.1.0", "is-finalizationregistry": "^1.1.0", "is-generator-function": "^1.0.10", "is-regex": "^1.2.1", "is-weakref": "^1.0.2", "isarray": "^2.0.5", "which-boxed-primitive": "^1.1.0", "which-collection": "^1.0.2", "which-typed-array": "^1.1.16" } }, "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q=="], - - "which-collection": ["which-collection@1.0.2", "", { "dependencies": { "is-map": "^2.0.3", "is-set": "^2.0.3", "is-weakmap": "^2.0.2", "is-weakset": "^2.0.3" } }, "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw=="], - - "which-typed-array": ["which-typed-array@1.1.19", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "for-each": "^0.3.5", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" } }, "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw=="], - - "win-export-certificate-and-key": ["win-export-certificate-and-key@2.1.0", "", { "dependencies": { "bindings": "^1.5.0", "node-addon-api": "^3.1.0" }, "os": "win32" }, "sha512-WeMLa/2uNZcS/HWGKU2G1Gzeh3vHpV/UFvwLhJLKxPHYFAbubxxVcJbqmPXaqySWK1Ymymh16zKK5WYIJ3zgzA=="], - - "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="], - - "wordwrap": ["wordwrap@1.0.0", "", {}, "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q=="], - - "wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], - - "wrap-ansi-cjs": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], - - "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], - - "ws": ["ws@8.17.1", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ=="], - - "xmlhttprequest-ssl": ["xmlhttprequest-ssl@2.1.2", "", {}, "sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ=="], - - "xtend": ["xtend@4.0.2", "", {}, "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="], - - "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], - - "yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], - - "yaml": ["yaml@2.8.0", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ=="], - - "yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "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.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], - - "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], - - "yauzl": ["yauzl@3.2.0", "", { "dependencies": { "buffer-crc32": "~0.2.3", "pend": "~1.2.0" } }, "sha512-Ow9nuGZE+qp1u4JIPvg+uCiUr7xGQWdff7JQSk5VGYTAZMDe2q8lxJ10ygv10qmSj031Ty/6FNJpLO4o1Sgc+w=="], - - "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], - - "yup": ["yup@1.6.1", "", { "dependencies": { "property-expr": "^2.0.5", "tiny-case": "^1.0.3", "toposort": "^2.0.2", "type-fest": "^2.19.0" } }, "sha512-JED8pB50qbA4FOkDol0bYF/p60qSEDQqBD0/qeIrUCG1KbPBIQ776fCUNb9ldbPcSTxA69g/47XTo4TqWiuXOA=="], - - "zip-stream": ["zip-stream@6.0.1", "", { "dependencies": { "archiver-utils": "^5.0.0", "compress-commons": "^6.0.2", "readable-stream": "^4.0.0" } }, "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA=="], - - "zod": ["zod@3.25.67", "", {}, "sha512-idA2YXwpCdqUSKRCACDE6ItZD9TZzy3OZMtpfLoh6oPR47lipysRrJfjzMqFxQ3uJuUPyUeWe1r9vLH33xO/Qw=="], - - "zod-to-json-schema": ["zod-to-json-schema@3.24.5", "", { "peerDependencies": { "zod": "^3.24.1" } }, "sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g=="], - - "zod-validation-error": ["zod-validation-error@3.5.2", "", { "peerDependencies": { "zod": "^3.25.0" } }, "sha512-mdi7YOLtram5dzJ5aDtm1AG9+mxRma1iaMrZdYIpFO7epdKBUwLHIxTF8CPDeCQ828zAXYtizrKlEJAtzgfgrw=="], - - "@aws-crypto/sha256-browser/@smithy/util-utf8": ["@smithy/util-utf8@2.3.0", "", { "dependencies": { "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A=="], - - "@aws-crypto/util/@smithy/util-utf8": ["@smithy/util-utf8@2.3.0", "", { "dependencies": { "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A=="], - - "@babel/core/json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], - - "@babel/core/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - - "@babel/helper-compilation-targets/lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], - - "@babel/helper-compilation-targets/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - - "@babel/traverse/globals": ["globals@11.12.0", "", {}, "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="], - - "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - - "@eslint/eslintrc/globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], - - "@eslint/eslintrc/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], - - "@eslint/eslintrc/strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], - - "@eslint/plugin-kit/@eslint/core": ["@eslint/core@0.15.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-b7ePw78tEWWkpgZCDYkbqDOP8dmM6qe+AOC6iuJqlq1R/0ahMAeH3qynpnqKFGkMltrp44ohV4ubGyvLX28tzw=="], - - "@hapi/topo/@hapi/hoek": ["@hapi/hoek@9.3.0", "", {}, "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ=="], - - "@humanfs/node/@humanwhocodes/retry": ["@humanwhocodes/retry@0.3.1", "", {}, "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA=="], - - "@isaacs/cliui/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], - - "@isaacs/cliui/strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="], - - "@mongodb-js/oidc-plugin/express": ["express@4.21.2", "", { "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", "finalhandler": "1.3.1", "fresh": "0.5.2", "http-errors": "2.0.0", "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "0.1.12", "proxy-addr": "~2.0.7", "qs": "6.13.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "0.19.0", "serve-static": "1.16.2", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" } }, "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA=="], - - "@sideway/address/@hapi/hoek": ["@hapi/hoek@9.3.0", "", {}, "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ=="], - - "@stock-bot/mongodb/@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@6.21.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.5.1", "@typescript-eslint/scope-manager": "6.21.0", "@typescript-eslint/type-utils": "6.21.0", "@typescript-eslint/utils": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", "natural-compare": "^1.4.0", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" }, "peerDependencies": { "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA=="], - - "@stock-bot/mongodb/@typescript-eslint/parser": ["@typescript-eslint/parser@6.21.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "6.21.0", "@typescript-eslint/types": "6.21.0", "@typescript-eslint/typescript-estree": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ=="], - - "@stock-bot/mongodb/eslint": ["eslint@8.57.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", "@eslint/js": "8.57.1", "@humanwhocodes/config-array": "^0.13.0", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.2.2", "eslint-visitor-keys": "^3.4.3", "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", "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.3", "strip-ansi": "^6.0.1", "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" } }, "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA=="], - - "@stock-bot/postgres/@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@6.21.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.5.1", "@typescript-eslint/scope-manager": "6.21.0", "@typescript-eslint/type-utils": "6.21.0", "@typescript-eslint/utils": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", "natural-compare": "^1.4.0", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" }, "peerDependencies": { "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA=="], - - "@stock-bot/postgres/@typescript-eslint/parser": ["@typescript-eslint/parser@6.21.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "6.21.0", "@typescript-eslint/types": "6.21.0", "@typescript-eslint/typescript-estree": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ=="], - - "@stock-bot/postgres/eslint": ["eslint@8.57.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", "@eslint/js": "8.57.1", "@humanwhocodes/config-array": "^0.13.0", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.2.2", "eslint-visitor-keys": "^3.4.3", "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", "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.3", "strip-ansi": "^6.0.1", "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" } }, "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA=="], - - "@stock-bot/questdb/@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@6.21.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.5.1", "@typescript-eslint/scope-manager": "6.21.0", "@typescript-eslint/type-utils": "6.21.0", "@typescript-eslint/utils": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", "natural-compare": "^1.4.0", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" }, "peerDependencies": { "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA=="], - - "@stock-bot/questdb/@typescript-eslint/parser": ["@typescript-eslint/parser@6.21.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "6.21.0", "@typescript-eslint/types": "6.21.0", "@typescript-eslint/typescript-estree": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ=="], - - "@stock-bot/questdb/eslint": ["eslint@8.57.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", "@eslint/js": "8.57.1", "@humanwhocodes/config-array": "^0.13.0", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.2.2", "eslint-visitor-keys": "^3.4.3", "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", "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.3", "strip-ansi": "^6.0.1", "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" } }, "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA=="], - - "@stock-bot/web-app/@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@6.21.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.5.1", "@typescript-eslint/scope-manager": "6.21.0", "@typescript-eslint/type-utils": "6.21.0", "@typescript-eslint/utils": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", "natural-compare": "^1.4.0", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" }, "peerDependencies": { "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA=="], - - "@stock-bot/web-app/@typescript-eslint/parser": ["@typescript-eslint/parser@6.21.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "6.21.0", "@typescript-eslint/types": "6.21.0", "@typescript-eslint/typescript-estree": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ=="], - - "@stock-bot/web-app/eslint": ["eslint@8.57.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", "@eslint/js": "8.57.1", "@humanwhocodes/config-array": "^0.13.0", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.2.2", "eslint-visitor-keys": "^3.4.3", "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", "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.3", "strip-ansi": "^6.0.1", "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" } }, "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA=="], - - "@types/cors/@types/node": ["@types/node@22.15.32", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-3jigKqgSjsH6gYZv2nEsqdXfZqIFGAV36XYYjf9KGZ3PSG+IhLecqPnI310RvjutyMwifE2hhhNEklOUrvx/wA=="], - - "@types/docker-modem/@types/node": ["@types/node@22.15.32", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-3jigKqgSjsH6gYZv2nEsqdXfZqIFGAV36XYYjf9KGZ3PSG+IhLecqPnI310RvjutyMwifE2hhhNEklOUrvx/wA=="], - - "@types/dockerode/@types/node": ["@types/node@22.15.32", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-3jigKqgSjsH6gYZv2nEsqdXfZqIFGAV36XYYjf9KGZ3PSG+IhLecqPnI310RvjutyMwifE2hhhNEklOUrvx/wA=="], - - "@types/glob/@types/node": ["@types/node@22.15.32", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-3jigKqgSjsH6gYZv2nEsqdXfZqIFGAV36XYYjf9KGZ3PSG+IhLecqPnI310RvjutyMwifE2hhhNEklOUrvx/wA=="], - - "@types/pg/@types/node": ["@types/node@22.15.32", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-3jigKqgSjsH6gYZv2nEsqdXfZqIFGAV36XYYjf9KGZ3PSG+IhLecqPnI310RvjutyMwifE2hhhNEklOUrvx/wA=="], - - "@types/ssh2/@types/node": ["@types/node@22.15.32", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-3jigKqgSjsH6gYZv2nEsqdXfZqIFGAV36XYYjf9KGZ3PSG+IhLecqPnI310RvjutyMwifE2hhhNEklOUrvx/wA=="], - - "@types/ssh2-streams/@types/node": ["@types/node@22.15.32", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-3jigKqgSjsH6gYZv2nEsqdXfZqIFGAV36XYYjf9KGZ3PSG+IhLecqPnI310RvjutyMwifE2hhhNEklOUrvx/wA=="], - - "@types/superagent/@types/node": ["@types/node@22.15.32", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-3jigKqgSjsH6gYZv2nEsqdXfZqIFGAV36XYYjf9KGZ3PSG+IhLecqPnI310RvjutyMwifE2hhhNEklOUrvx/wA=="], - - "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], - - "anymatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], - - "archiver-utils/is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="], - - "bl/buffer": ["buffer@5.7.1", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ=="], - - "bl/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], - - "bun-types/@types/node": ["@types/node@22.15.32", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-3jigKqgSjsH6gYZv2nEsqdXfZqIFGAV36XYYjf9KGZ3PSG+IhLecqPnI310RvjutyMwifE2hhhNEklOUrvx/wA=="], - - "chokidar/fsevents": ["fsevents@2.3.2", "", { "os": "darwin" }, "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA=="], - - "chokidar/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], - - "cliui/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], - - "compress-commons/is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="], - - "decompress-response/mimic-response": ["mimic-response@3.1.0", "", {}, "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ=="], - - "docker-modem/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], - - "dockerode/tar-fs": ["tar-fs@2.1.3", "", { "dependencies": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", "pump": "^3.0.0", "tar-stream": "^2.1.4" } }, "sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg=="], - - "dockerode/uuid": ["uuid@10.0.0", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ=="], - - "engine.io/@types/node": ["@types/node@22.15.32", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-3jigKqgSjsH6gYZv2nEsqdXfZqIFGAV36XYYjf9KGZ3PSG+IhLecqPnI310RvjutyMwifE2hhhNEklOUrvx/wA=="], - - "engine.io/debug": ["debug@4.3.7", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ=="], - - "engine.io-client/debug": ["debug@4.3.7", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ=="], - - "eslint/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - - "eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], - - "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], - - "eslint-module-utils/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], - - "eslint-plugin-import/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], - - "eslint-plugin-import/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - - "eslint-plugin-node/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], - - "eslint-plugin-node/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - - "eslint-plugin-react/resolve": ["resolve@2.0.0-next.5", "", { "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA=="], - - "eslint-plugin-react/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - - "eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@1.3.0", "", {}, "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ=="], - - "execa/get-stream": ["get-stream@6.0.1", "", {}, "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="], - - "execa/is-stream": ["is-stream@3.0.0", "", {}, "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA=="], - - "execa/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], - - "express/accepts": ["accepts@2.0.0", "", { "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" } }, "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng=="], - - "express/mime-types": ["mime-types@3.0.1", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA=="], - - "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], - - "get-uri/data-uri-to-buffer": ["data-uri-to-buffer@6.0.2", "", {}, "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw=="], - - "glob/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], - - "globals/type-fest": ["type-fest@0.20.2", "", {}, "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ=="], - - "globby/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], - - "got/type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="], - - "http-errors/statuses": ["statuses@2.0.1", "", {}, "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="], - - "is-wsl/is-docker": ["is-docker@2.2.1", "", { "bin": { "is-docker": "cli.js" } }, "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="], - - "joi/@hapi/hoek": ["@hapi/hoek@9.3.0", "", {}, "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ=="], - - "knip/jiti": ["jiti@2.4.2", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A=="], - - "lazystream/readable-stream": ["readable-stream@2.3.8", "", { "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" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], - - "macos-export-certificate-and-key/node-addon-api": ["node-addon-api@4.3.0", "", {}, "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ=="], - - "make-dir/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - - "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], - - "mongodb-client-encryption/node-addon-api": ["node-addon-api@4.3.0", "", {}, "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ=="], - - "mongodb-client-encryption/prebuild-install": ["prebuild-install@7.1.3", "", { "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": "^2.0.0", "node-abi": "^3.3.0", "pump": "^3.0.0", "rc": "^1.2.7", "simple-get": "^4.0.0", "tar-fs": "^2.0.0", "tunnel-agent": "^0.6.0" }, "bin": { "prebuild-install": "bin.js" } }, "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug=="], - - "mongodb-mcp-server/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.13.0", "", { "dependencies": { "ajv": "^6.12.6", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.24.1" } }, "sha512-P5FZsXU0kY881F6Hbk9GhsYx02/KgWK1DYf7/tyE/1lcFKhDYPQR9iYjhQXJn+Sg6hQleMo3DB7h7+p4wgp2Lw=="], - - "mongodb-memory-server-core/mongodb": ["mongodb@5.9.2", "", { "dependencies": { "bson": "^5.5.0", "mongodb-connection-string-url": "^2.6.0", "socks": "^2.7.1" }, "optionalDependencies": { "@mongodb-js/saslprep": "^1.1.0" }, "peerDependencies": { "@aws-sdk/credential-providers": "^3.188.0", "@mongodb-js/zstd": "^1.0.0", "kerberos": "^1.0.0 || ^2.0.0", "mongodb-client-encryption": ">=2.3.0 <3", "snappy": "^7.2.2" }, "optionalPeers": ["@aws-sdk/credential-providers", "@mongodb-js/zstd", "kerberos", "mongodb-client-encryption", "snappy"] }, "sha512-H60HecKO4Bc+7dhOv4sJlgvenK4fQNqqUIlXxZYQNbfEWSALGAwGoyJd/0Qwk4TttFXUOHJ2ZJQe/52ScaUwtQ=="], - - "nearley/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], - - "npm-run-path/path-key": ["path-key@4.0.0", "", {}, "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ=="], - - "openid-client/lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], - - "os-dns-native/node-addon-api": ["node-addon-api@4.3.0", "", {}, "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ=="], - - "path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], - - "pg-mem/lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], - - "pino-pretty/strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], - - "pkg-dir/find-up": ["find-up@4.1.0", "", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="], - - "playwright/fsevents": ["fsevents@2.3.2", "", { "os": "darwin" }, "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA=="], - - "prebuild-install/tar-fs": ["tar-fs@2.1.3", "", { "dependencies": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", "pump": "^3.0.0", "tar-stream": "^2.1.4" } }, "sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg=="], - - "prop-types/react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="], - - "proper-lockfile/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], - - "protobufjs/@types/node": ["@types/node@22.15.32", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-3jigKqgSjsH6gYZv2nEsqdXfZqIFGAV36XYYjf9KGZ3PSG+IhLecqPnI310RvjutyMwifE2hhhNEklOUrvx/wA=="], - - "rc/strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], - - "react-router/cookie": ["cookie@1.0.2", "", {}, "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA=="], - - "readdir-glob/minimatch": ["minimatch@5.1.6", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g=="], - - "readdirp/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], - - "recharts/eventemitter3": ["eventemitter3@4.0.7", "", {}, "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="], - - "rimraf/glob": ["glob@7.2.3", "", { "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" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], - - "rollup/fsevents": ["fsevents@2.3.2", "", { "os": "darwin" }, "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA=="], - - "run-applescript/execa": ["execa@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" } }, "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg=="], - - "send/mime-types": ["mime-types@3.0.1", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA=="], - - "socket.io/debug": ["debug@4.3.7", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ=="], - - "socket.io-adapter/debug": ["debug@4.3.7", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ=="], - - "socket.io-client/debug": ["debug@4.3.7", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ=="], - - "socket.io-parser/debug": ["debug@4.3.7", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ=="], - - "sucrase/commander": ["commander@4.1.1", "", {}, "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="], - - "table/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - - "tailwindcss/object-hash": ["object-hash@3.0.0", "", {}, "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw=="], - - "ts-unused-exports/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - - "type-is/mime-types": ["mime-types@3.0.1", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA=="], - - "vite/esbuild": ["esbuild@0.18.20", "", { "optionalDependencies": { "@esbuild/android-arm": "0.18.20", "@esbuild/android-arm64": "0.18.20", "@esbuild/android-x64": "0.18.20", "@esbuild/darwin-arm64": "0.18.20", "@esbuild/darwin-x64": "0.18.20", "@esbuild/freebsd-arm64": "0.18.20", "@esbuild/freebsd-x64": "0.18.20", "@esbuild/linux-arm": "0.18.20", "@esbuild/linux-arm64": "0.18.20", "@esbuild/linux-ia32": "0.18.20", "@esbuild/linux-loong64": "0.18.20", "@esbuild/linux-mips64el": "0.18.20", "@esbuild/linux-ppc64": "0.18.20", "@esbuild/linux-riscv64": "0.18.20", "@esbuild/linux-s390x": "0.18.20", "@esbuild/linux-x64": "0.18.20", "@esbuild/netbsd-x64": "0.18.20", "@esbuild/openbsd-x64": "0.18.20", "@esbuild/sunos-x64": "0.18.20", "@esbuild/win32-arm64": "0.18.20", "@esbuild/win32-ia32": "0.18.20", "@esbuild/win32-x64": "0.18.20" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA=="], - - "vite/fsevents": ["fsevents@2.3.2", "", { "os": "darwin" }, "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA=="], - - "win-export-certificate-and-key/node-addon-api": ["node-addon-api@3.2.1", "", {}, "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A=="], - - "wrap-ansi/ansi-styles": ["ansi-styles@6.2.1", "", {}, "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="], - - "wrap-ansi/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], - - "wrap-ansi/strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="], - - "yauzl/buffer-crc32": ["buffer-crc32@0.2.13", "", {}, "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ=="], - - "@aws-crypto/sha256-browser/@smithy/util-utf8/@smithy/util-buffer-from": ["@smithy/util-buffer-from@2.2.0", "", { "dependencies": { "@smithy/is-array-buffer": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA=="], - - "@aws-crypto/util/@smithy/util-utf8/@smithy/util-buffer-from": ["@smithy/util-buffer-from@2.2.0", "", { "dependencies": { "@smithy/is-array-buffer": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA=="], - - "@babel/helper-compilation-targets/lru-cache/yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], - - "@isaacs/cliui/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], - - "@isaacs/cliui/strip-ansi/ansi-regex": ["ansi-regex@6.1.0", "", {}, "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="], - - "@mongodb-js/oidc-plugin/express/body-parser": ["body-parser@1.20.3", "", { "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.5", "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.13.0", "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" } }, "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g=="], - - "@mongodb-js/oidc-plugin/express/content-disposition": ["content-disposition@0.5.4", "", { "dependencies": { "safe-buffer": "5.2.1" } }, "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ=="], - - "@mongodb-js/oidc-plugin/express/cookie": ["cookie@0.7.1", "", {}, "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w=="], - - "@mongodb-js/oidc-plugin/express/cookie-signature": ["cookie-signature@1.0.6", "", {}, "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="], - - "@mongodb-js/oidc-plugin/express/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], - - "@mongodb-js/oidc-plugin/express/finalhandler": ["finalhandler@1.3.1", "", { "dependencies": { "debug": "2.6.9", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", "statuses": "2.0.1", "unpipe": "~1.0.0" } }, "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ=="], - - "@mongodb-js/oidc-plugin/express/fresh": ["fresh@0.5.2", "", {}, "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="], - - "@mongodb-js/oidc-plugin/express/merge-descriptors": ["merge-descriptors@1.0.3", "", {}, "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ=="], - - "@mongodb-js/oidc-plugin/express/path-to-regexp": ["path-to-regexp@0.1.12", "", {}, "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ=="], - - "@mongodb-js/oidc-plugin/express/qs": ["qs@6.13.0", "", { "dependencies": { "side-channel": "^1.0.6" } }, "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg=="], - - "@mongodb-js/oidc-plugin/express/send": ["send@0.19.0", "", { "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" } }, "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw=="], - - "@mongodb-js/oidc-plugin/express/serve-static": ["serve-static@1.16.2", "", { "dependencies": { "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", "send": "0.19.0" } }, "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw=="], - - "@mongodb-js/oidc-plugin/express/statuses": ["statuses@2.0.1", "", {}, "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="], - - "@mongodb-js/oidc-plugin/express/type-is": ["type-is@1.6.18", "", { "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" } }, "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g=="], - - "@stock-bot/mongodb/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0" } }, "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg=="], - - "@stock-bot/mongodb/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@6.21.0", "", { "dependencies": { "@typescript-eslint/typescript-estree": "6.21.0", "@typescript-eslint/utils": "6.21.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag=="], - - "@stock-bot/mongodb/@typescript-eslint/eslint-plugin/@typescript-eslint/utils": ["@typescript-eslint/utils@6.21.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", "@typescript-eslint/scope-manager": "6.21.0", "@typescript-eslint/types": "6.21.0", "@typescript-eslint/typescript-estree": "6.21.0", "semver": "^7.5.4" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ=="], - - "@stock-bot/mongodb/@typescript-eslint/eslint-plugin/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "eslint-visitor-keys": "^3.4.1" } }, "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A=="], - - "@stock-bot/mongodb/@typescript-eslint/eslint-plugin/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], - - "@stock-bot/mongodb/@typescript-eslint/eslint-plugin/ts-api-utils": ["ts-api-utils@1.4.3", "", { "peerDependencies": { "typescript": ">=4.2.0" } }, "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw=="], - - "@stock-bot/mongodb/@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0" } }, "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg=="], - - "@stock-bot/mongodb/@typescript-eslint/parser/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="], - - "@stock-bot/mongodb/@typescript-eslint/parser/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "9.0.3", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" } }, "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ=="], - - "@stock-bot/mongodb/@typescript-eslint/parser/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "eslint-visitor-keys": "^3.4.1" } }, "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A=="], - - "@stock-bot/mongodb/eslint/@eslint/eslintrc": ["@eslint/eslintrc@2.1.4", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^9.6.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" } }, "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ=="], - - "@stock-bot/mongodb/eslint/@eslint/js": ["@eslint/js@8.57.1", "", {}, "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q=="], - - "@stock-bot/mongodb/eslint/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - - "@stock-bot/mongodb/eslint/doctrine": ["doctrine@3.0.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w=="], - - "@stock-bot/mongodb/eslint/eslint-scope": ["eslint-scope@7.2.2", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg=="], - - "@stock-bot/mongodb/eslint/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - - "@stock-bot/mongodb/eslint/espree": ["espree@9.6.1", "", { "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.1" } }, "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ=="], - - "@stock-bot/mongodb/eslint/file-entry-cache": ["file-entry-cache@6.0.1", "", { "dependencies": { "flat-cache": "^3.0.4" } }, "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg=="], - - "@stock-bot/mongodb/eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], - - "@stock-bot/postgres/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0" } }, "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg=="], - - "@stock-bot/postgres/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@6.21.0", "", { "dependencies": { "@typescript-eslint/typescript-estree": "6.21.0", "@typescript-eslint/utils": "6.21.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag=="], - - "@stock-bot/postgres/@typescript-eslint/eslint-plugin/@typescript-eslint/utils": ["@typescript-eslint/utils@6.21.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", "@typescript-eslint/scope-manager": "6.21.0", "@typescript-eslint/types": "6.21.0", "@typescript-eslint/typescript-estree": "6.21.0", "semver": "^7.5.4" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ=="], - - "@stock-bot/postgres/@typescript-eslint/eslint-plugin/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "eslint-visitor-keys": "^3.4.1" } }, "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A=="], - - "@stock-bot/postgres/@typescript-eslint/eslint-plugin/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], - - "@stock-bot/postgres/@typescript-eslint/eslint-plugin/ts-api-utils": ["ts-api-utils@1.4.3", "", { "peerDependencies": { "typescript": ">=4.2.0" } }, "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw=="], - - "@stock-bot/postgres/@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0" } }, "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg=="], - - "@stock-bot/postgres/@typescript-eslint/parser/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="], - - "@stock-bot/postgres/@typescript-eslint/parser/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "9.0.3", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" } }, "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ=="], - - "@stock-bot/postgres/@typescript-eslint/parser/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "eslint-visitor-keys": "^3.4.1" } }, "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A=="], - - "@stock-bot/postgres/eslint/@eslint/eslintrc": ["@eslint/eslintrc@2.1.4", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^9.6.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" } }, "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ=="], - - "@stock-bot/postgres/eslint/@eslint/js": ["@eslint/js@8.57.1", "", {}, "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q=="], - - "@stock-bot/postgres/eslint/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - - "@stock-bot/postgres/eslint/doctrine": ["doctrine@3.0.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w=="], - - "@stock-bot/postgres/eslint/eslint-scope": ["eslint-scope@7.2.2", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg=="], - - "@stock-bot/postgres/eslint/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - - "@stock-bot/postgres/eslint/espree": ["espree@9.6.1", "", { "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.1" } }, "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ=="], - - "@stock-bot/postgres/eslint/file-entry-cache": ["file-entry-cache@6.0.1", "", { "dependencies": { "flat-cache": "^3.0.4" } }, "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg=="], - - "@stock-bot/postgres/eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], - - "@stock-bot/questdb/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0" } }, "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg=="], - - "@stock-bot/questdb/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@6.21.0", "", { "dependencies": { "@typescript-eslint/typescript-estree": "6.21.0", "@typescript-eslint/utils": "6.21.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag=="], - - "@stock-bot/questdb/@typescript-eslint/eslint-plugin/@typescript-eslint/utils": ["@typescript-eslint/utils@6.21.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", "@typescript-eslint/scope-manager": "6.21.0", "@typescript-eslint/types": "6.21.0", "@typescript-eslint/typescript-estree": "6.21.0", "semver": "^7.5.4" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ=="], - - "@stock-bot/questdb/@typescript-eslint/eslint-plugin/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "eslint-visitor-keys": "^3.4.1" } }, "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A=="], - - "@stock-bot/questdb/@typescript-eslint/eslint-plugin/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], - - "@stock-bot/questdb/@typescript-eslint/eslint-plugin/ts-api-utils": ["ts-api-utils@1.4.3", "", { "peerDependencies": { "typescript": ">=4.2.0" } }, "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw=="], - - "@stock-bot/questdb/@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0" } }, "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg=="], - - "@stock-bot/questdb/@typescript-eslint/parser/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="], - - "@stock-bot/questdb/@typescript-eslint/parser/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "9.0.3", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" } }, "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ=="], - - "@stock-bot/questdb/@typescript-eslint/parser/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "eslint-visitor-keys": "^3.4.1" } }, "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A=="], - - "@stock-bot/questdb/eslint/@eslint/eslintrc": ["@eslint/eslintrc@2.1.4", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^9.6.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" } }, "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ=="], - - "@stock-bot/questdb/eslint/@eslint/js": ["@eslint/js@8.57.1", "", {}, "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q=="], - - "@stock-bot/questdb/eslint/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - - "@stock-bot/questdb/eslint/doctrine": ["doctrine@3.0.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w=="], - - "@stock-bot/questdb/eslint/eslint-scope": ["eslint-scope@7.2.2", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg=="], - - "@stock-bot/questdb/eslint/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - - "@stock-bot/questdb/eslint/espree": ["espree@9.6.1", "", { "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.1" } }, "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ=="], - - "@stock-bot/questdb/eslint/file-entry-cache": ["file-entry-cache@6.0.1", "", { "dependencies": { "flat-cache": "^3.0.4" } }, "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg=="], - - "@stock-bot/questdb/eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], - - "@stock-bot/web-app/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0" } }, "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg=="], - - "@stock-bot/web-app/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@6.21.0", "", { "dependencies": { "@typescript-eslint/typescript-estree": "6.21.0", "@typescript-eslint/utils": "6.21.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag=="], - - "@stock-bot/web-app/@typescript-eslint/eslint-plugin/@typescript-eslint/utils": ["@typescript-eslint/utils@6.21.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", "@typescript-eslint/scope-manager": "6.21.0", "@typescript-eslint/types": "6.21.0", "@typescript-eslint/typescript-estree": "6.21.0", "semver": "^7.5.4" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ=="], - - "@stock-bot/web-app/@typescript-eslint/eslint-plugin/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "eslint-visitor-keys": "^3.4.1" } }, "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A=="], - - "@stock-bot/web-app/@typescript-eslint/eslint-plugin/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], - - "@stock-bot/web-app/@typescript-eslint/eslint-plugin/ts-api-utils": ["ts-api-utils@1.4.3", "", { "peerDependencies": { "typescript": ">=4.2.0" } }, "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw=="], - - "@stock-bot/web-app/@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0" } }, "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg=="], - - "@stock-bot/web-app/@typescript-eslint/parser/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="], - - "@stock-bot/web-app/@typescript-eslint/parser/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "9.0.3", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" } }, "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ=="], - - "@stock-bot/web-app/@typescript-eslint/parser/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "eslint-visitor-keys": "^3.4.1" } }, "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A=="], - - "@stock-bot/web-app/eslint/@eslint/eslintrc": ["@eslint/eslintrc@2.1.4", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^9.6.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" } }, "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ=="], - - "@stock-bot/web-app/eslint/@eslint/js": ["@eslint/js@8.57.1", "", {}, "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q=="], - - "@stock-bot/web-app/eslint/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - - "@stock-bot/web-app/eslint/doctrine": ["doctrine@3.0.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w=="], - - "@stock-bot/web-app/eslint/eslint-scope": ["eslint-scope@7.2.2", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg=="], - - "@stock-bot/web-app/eslint/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - - "@stock-bot/web-app/eslint/espree": ["espree@9.6.1", "", { "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.1" } }, "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ=="], - - "@stock-bot/web-app/eslint/file-entry-cache": ["file-entry-cache@6.0.1", "", { "dependencies": { "flat-cache": "^3.0.4" } }, "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg=="], - - "@stock-bot/web-app/eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], - - "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], - - "dockerode/tar-fs/tar-stream": ["tar-stream@2.2.0", "", { "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", "fs-constants": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^3.1.1" } }, "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ=="], - - "express/accepts/negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="], - - "express/mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], - - "glob/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], - - "lazystream/readable-stream/isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], - - "lazystream/readable-stream/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], - - "lazystream/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], - - "mongodb-client-encryption/prebuild-install/napi-build-utils": ["napi-build-utils@2.0.0", "", {}, "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA=="], - - "mongodb-client-encryption/prebuild-install/tar-fs": ["tar-fs@2.1.3", "", { "dependencies": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", "pump": "^3.0.0", "tar-stream": "^2.1.4" } }, "sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg=="], - - "mongodb-memory-server-core/mongodb/bson": ["bson@5.5.1", "", {}, "sha512-ix0EwukN2EpC0SRWIj/7B5+A6uQMQy6KMREI9qQqvgpkV2frH63T0UDVd1SYedL6dNCmDBYB3QtXi4ISk9YT+g=="], - - "mongodb-memory-server-core/mongodb/mongodb-connection-string-url": ["mongodb-connection-string-url@2.6.0", "", { "dependencies": { "@types/whatwg-url": "^8.2.1", "whatwg-url": "^11.0.0" } }, "sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ=="], - - "pkg-dir/find-up/locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="], - - "prebuild-install/tar-fs/tar-stream": ["tar-stream@2.2.0", "", { "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", "fs-constants": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^3.1.1" } }, "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ=="], - - "readdir-glob/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], - - "run-applescript/execa/get-stream": ["get-stream@6.0.1", "", {}, "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="], - - "run-applescript/execa/human-signals": ["human-signals@2.1.0", "", {}, "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw=="], - - "run-applescript/execa/is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="], - - "run-applescript/execa/npm-run-path": ["npm-run-path@4.0.1", "", { "dependencies": { "path-key": "^3.0.0" } }, "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw=="], - - "run-applescript/execa/onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], - - "run-applescript/execa/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], - - "run-applescript/execa/strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="], - - "send/mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], - - "table/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - - "type-is/mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], - - "vite/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.18.20", "", { "os": "android", "cpu": "arm" }, "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw=="], - - "vite/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.18.20", "", { "os": "android", "cpu": "arm64" }, "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ=="], - - "vite/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.18.20", "", { "os": "android", "cpu": "x64" }, "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg=="], - - "vite/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.18.20", "", { "os": "darwin", "cpu": "arm64" }, "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA=="], - - "vite/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.18.20", "", { "os": "darwin", "cpu": "x64" }, "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ=="], - - "vite/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.18.20", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw=="], - - "vite/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.18.20", "", { "os": "freebsd", "cpu": "x64" }, "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ=="], - - "vite/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.18.20", "", { "os": "linux", "cpu": "arm" }, "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg=="], - - "vite/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.18.20", "", { "os": "linux", "cpu": "arm64" }, "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA=="], - - "vite/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.18.20", "", { "os": "linux", "cpu": "ia32" }, "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA=="], - - "vite/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.18.20", "", { "os": "linux", "cpu": "none" }, "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg=="], - - "vite/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.18.20", "", { "os": "linux", "cpu": "none" }, "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ=="], - - "vite/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.18.20", "", { "os": "linux", "cpu": "ppc64" }, "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA=="], - - "vite/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.18.20", "", { "os": "linux", "cpu": "none" }, "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A=="], - - "vite/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.18.20", "", { "os": "linux", "cpu": "s390x" }, "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ=="], - - "vite/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.18.20", "", { "os": "linux", "cpu": "x64" }, "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w=="], - - "vite/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.18.20", "", { "os": "none", "cpu": "x64" }, "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A=="], - - "vite/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.18.20", "", { "os": "openbsd", "cpu": "x64" }, "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg=="], - - "vite/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.18.20", "", { "os": "sunos", "cpu": "x64" }, "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ=="], - - "vite/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.18.20", "", { "os": "win32", "cpu": "arm64" }, "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg=="], - - "vite/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.18.20", "", { "os": "win32", "cpu": "ia32" }, "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g=="], - - "vite/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.18.20", "", { "os": "win32", "cpu": "x64" }, "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ=="], - - "wrap-ansi/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], - - "wrap-ansi/strip-ansi/ansi-regex": ["ansi-regex@6.1.0", "", {}, "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="], - - "@aws-crypto/sha256-browser/@smithy/util-utf8/@smithy/util-buffer-from/@smithy/is-array-buffer": ["@smithy/is-array-buffer@2.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA=="], - - "@aws-crypto/util/@smithy/util-utf8/@smithy/util-buffer-from/@smithy/is-array-buffer": ["@smithy/is-array-buffer@2.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA=="], - - "@mongodb-js/oidc-plugin/express/body-parser/iconv-lite": ["iconv-lite@0.4.24", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="], - - "@mongodb-js/oidc-plugin/express/body-parser/raw-body": ["raw-body@2.5.2", "", { "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" } }, "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA=="], - - "@mongodb-js/oidc-plugin/express/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], - - "@mongodb-js/oidc-plugin/express/send/encodeurl": ["encodeurl@1.0.2", "", {}, "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="], - - "@mongodb-js/oidc-plugin/express/send/mime": ["mime@1.6.0", "", { "bin": { "mime": "cli.js" } }, "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="], - - "@mongodb-js/oidc-plugin/express/type-is/media-typer": ["media-typer@0.3.0", "", {}, "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ=="], - - "@stock-bot/mongodb/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="], - - "@stock-bot/mongodb/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "9.0.3", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" } }, "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ=="], - - "@stock-bot/mongodb/@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="], - - "@stock-bot/mongodb/@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "9.0.3", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" } }, "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ=="], - - "@stock-bot/mongodb/@typescript-eslint/eslint-plugin/@typescript-eslint/visitor-keys/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="], - - "@stock-bot/mongodb/@typescript-eslint/eslint-plugin/@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - - "@stock-bot/mongodb/@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.3", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg=="], - - "@stock-bot/mongodb/@typescript-eslint/parser/@typescript-eslint/typescript-estree/ts-api-utils": ["ts-api-utils@1.4.3", "", { "peerDependencies": { "typescript": ">=4.2.0" } }, "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw=="], - - "@stock-bot/mongodb/@typescript-eslint/parser/@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - - "@stock-bot/mongodb/eslint/@eslint/eslintrc/strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], - - "@stock-bot/mongodb/eslint/file-entry-cache/flat-cache": ["flat-cache@3.2.0", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", "rimraf": "^3.0.2" } }, "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw=="], - - "@stock-bot/postgres/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="], - - "@stock-bot/postgres/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "9.0.3", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" } }, "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ=="], - - "@stock-bot/postgres/@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="], - - "@stock-bot/postgres/@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "9.0.3", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" } }, "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ=="], - - "@stock-bot/postgres/@typescript-eslint/eslint-plugin/@typescript-eslint/visitor-keys/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="], - - "@stock-bot/postgres/@typescript-eslint/eslint-plugin/@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - - "@stock-bot/postgres/@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.3", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg=="], - - "@stock-bot/postgres/@typescript-eslint/parser/@typescript-eslint/typescript-estree/ts-api-utils": ["ts-api-utils@1.4.3", "", { "peerDependencies": { "typescript": ">=4.2.0" } }, "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw=="], - - "@stock-bot/postgres/@typescript-eslint/parser/@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - - "@stock-bot/postgres/eslint/@eslint/eslintrc/strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], - - "@stock-bot/postgres/eslint/file-entry-cache/flat-cache": ["flat-cache@3.2.0", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", "rimraf": "^3.0.2" } }, "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw=="], - - "@stock-bot/questdb/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="], - - "@stock-bot/questdb/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "9.0.3", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" } }, "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ=="], - - "@stock-bot/questdb/@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="], - - "@stock-bot/questdb/@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "9.0.3", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" } }, "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ=="], - - "@stock-bot/questdb/@typescript-eslint/eslint-plugin/@typescript-eslint/visitor-keys/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="], - - "@stock-bot/questdb/@typescript-eslint/eslint-plugin/@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - - "@stock-bot/questdb/@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.3", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg=="], - - "@stock-bot/questdb/@typescript-eslint/parser/@typescript-eslint/typescript-estree/ts-api-utils": ["ts-api-utils@1.4.3", "", { "peerDependencies": { "typescript": ">=4.2.0" } }, "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw=="], - - "@stock-bot/questdb/@typescript-eslint/parser/@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - - "@stock-bot/questdb/eslint/@eslint/eslintrc/strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], - - "@stock-bot/questdb/eslint/file-entry-cache/flat-cache": ["flat-cache@3.2.0", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", "rimraf": "^3.0.2" } }, "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw=="], - - "@stock-bot/web-app/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="], - - "@stock-bot/web-app/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "9.0.3", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" } }, "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ=="], - - "@stock-bot/web-app/@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="], - - "@stock-bot/web-app/@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "9.0.3", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" } }, "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ=="], - - "@stock-bot/web-app/@typescript-eslint/eslint-plugin/@typescript-eslint/visitor-keys/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="], - - "@stock-bot/web-app/@typescript-eslint/eslint-plugin/@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - - "@stock-bot/web-app/@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.3", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg=="], - - "@stock-bot/web-app/@typescript-eslint/parser/@typescript-eslint/typescript-estree/ts-api-utils": ["ts-api-utils@1.4.3", "", { "peerDependencies": { "typescript": ">=4.2.0" } }, "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw=="], - - "@stock-bot/web-app/@typescript-eslint/parser/@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - - "@stock-bot/web-app/eslint/@eslint/eslintrc/strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], - - "@stock-bot/web-app/eslint/file-entry-cache/flat-cache": ["flat-cache@3.2.0", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", "rimraf": "^3.0.2" } }, "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw=="], - - "dockerode/tar-fs/tar-stream/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], - - "mongodb-client-encryption/prebuild-install/tar-fs/tar-stream": ["tar-stream@2.2.0", "", { "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", "fs-constants": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^3.1.1" } }, "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ=="], - - "mongodb-memory-server-core/mongodb/mongodb-connection-string-url/@types/whatwg-url": ["@types/whatwg-url@8.2.2", "", { "dependencies": { "@types/node": "*", "@types/webidl-conversions": "*" } }, "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA=="], - - "mongodb-memory-server-core/mongodb/mongodb-connection-string-url/whatwg-url": ["whatwg-url@11.0.0", "", { "dependencies": { "tr46": "^3.0.0", "webidl-conversions": "^7.0.0" } }, "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ=="], - - "pkg-dir/find-up/locate-path/p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="], - - "prebuild-install/tar-fs/tar-stream/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], - - "run-applescript/execa/onetime/mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="], - - "@stock-bot/mongodb/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="], - - "@stock-bot/mongodb/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.3", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg=="], - - "@stock-bot/mongodb/@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.3", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg=="], - - "@stock-bot/mongodb/@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], - - "@stock-bot/postgres/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="], - - "@stock-bot/postgres/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.3", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg=="], - - "@stock-bot/postgres/@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.3", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg=="], - - "@stock-bot/postgres/@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], - - "@stock-bot/questdb/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="], - - "@stock-bot/questdb/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.3", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg=="], - - "@stock-bot/questdb/@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.3", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg=="], - - "@stock-bot/questdb/@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], - - "@stock-bot/web-app/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="], - - "@stock-bot/web-app/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.3", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg=="], - - "@stock-bot/web-app/@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.3", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg=="], - - "@stock-bot/web-app/@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], - - "mongodb-client-encryption/prebuild-install/tar-fs/tar-stream/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], - - "mongodb-memory-server-core/mongodb/mongodb-connection-string-url/@types/whatwg-url/@types/node": ["@types/node@22.15.32", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-3jigKqgSjsH6gYZv2nEsqdXfZqIFGAV36XYYjf9KGZ3PSG+IhLecqPnI310RvjutyMwifE2hhhNEklOUrvx/wA=="], - - "mongodb-memory-server-core/mongodb/mongodb-connection-string-url/whatwg-url/tr46": ["tr46@3.0.0", "", { "dependencies": { "punycode": "^2.1.1" } }, "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA=="], - - "pkg-dir/find-up/locate-path/p-locate/p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], - - "@stock-bot/mongodb/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], - - "@stock-bot/mongodb/@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], - - "@stock-bot/postgres/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], - - "@stock-bot/postgres/@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], - - "@stock-bot/questdb/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], - - "@stock-bot/questdb/@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], - - "@stock-bot/web-app/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], - - "@stock-bot/web-app/@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], - } -} diff --git a/libs/data/mongodb/src/client.ts b/libs/data/mongodb/src/client.ts index 9086573..1b63adf 100644 --- a/libs/data/mongodb/src/client.ts +++ b/libs/data/mongodb/src/client.ts @@ -1,4 +1,4 @@ -import type { Logger } from '@stock-bot/core/logger'; +import type { Logger } from '@stock-bot/engine/logger'; import type { OptionalUnlessRequiredId } from 'mongodb'; import { Collection, Db, MongoClient } from 'mongodb'; import type { diff --git a/package.json b/package.json index 1798985..4f3342a 100644 --- a/package.json +++ b/package.json @@ -68,7 +68,7 @@ "apps/stock/data-pipeline", "apps/stock/web-api", "apps/stock/web-app", - "apps/stock/core", + "apps/stock/engine", "apps/stock/orchestrator", "tools/*" ], diff --git a/tools/coverage-cli/README.md b/tools/coverage-cli/README.md index bdeb071..db6fd90 100644 --- a/tools/coverage-cli/README.md +++ b/tools/coverage-cli/README.md @@ -108,7 +108,7 @@ Beautiful colored output in your terminal: ┌────────────────┬──────────┬──────────┬──────────┬────────────┐ │ Package │ Lines │ Functions│ Branches │ Statements │ ├────────────────┼──────────┼──────────┼──────────┼────────────┤ -│ @stock-bot/core│ 85.3% ✓ │ 82.1% ✓ │ 79.2% ⚠ │ 84.7% ✓ │ +│ @stock-bot/engine│ 85.3% ✓ │ 82.1% ✓ │ 79.2% ⚠ │ 84.7% ✓ │ │ @stock-bot/utils│ 92.1% ✓ │ 90.5% ✓ │ 88.3% ✓ │ 91.8% ✓ │ ├────────────────┼──────────┼──────────┼──────────┼────────────┤ │ Overall │ 88.7% ✓ │ 86.3% ✓ │ 83.8% ✓ │ 88.3% ✓ │