diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 0000000..96c5bcb --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,112 @@ +name: Documentation + +on: + push: + branches: [ main ] + paths: + - 'src/**' + - 'website/**' + - 'build.zig' + - '.github/workflows/docs.yml' + pull_request: + branches: [ main ] + paths: + - 'src/**' + - 'website/**' + - 'build.zig' + +env: + ZIG_VERSION: 0.14.1 + NODE_VERSION: 18 + +jobs: + generate-docs: + name: Generate API Documentation + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Setup Zig + uses: goto-bus-stop/setup-zig@v2 + with: + version: ${{ env.ZIG_VERSION }} + + - name: Install system dependencies + run: | + sudo apt-get update -qq + sudo apt-get install -y \ + build-essential \ + cmake \ + libboost-all-dev \ + libssl-dev \ + pkg-config + + - name: Generate Zig documentation + run: | + echo "🔨 Generating Zig documentation..." + zig build docs + echo "✅ Documentation generated" + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: ${{ env.NODE_VERSION }} + + - name: Setup pnpm + uses: pnpm/action-setup@v4 + with: + version: latest + + - name: Install website dependencies + run: | + cd website + pnpm install + + - name: Copy API docs to website + run: | + echo "📁 Copying API documentation to website..." + mkdir -p website/static/api-docs + cp -r zig-out/docs/* website/static/api-docs/ + echo "✅ API docs copied" + + - name: Build website + run: | + cd website + pnpm build + + - name: Upload documentation artifacts + uses: actions/upload-artifact@v4 + with: + name: documentation + path: | + zig-out/docs/ + website/build/ + + deploy-docs: + name: Deploy Documentation + if: github.ref == 'refs/heads/main' && github.event_name == 'push' + needs: generate-docs + runs-on: ubuntu-latest + permissions: + pages: write + id-token: write + steps: + - name: Download documentation artifacts + uses: actions/download-artifact@v4 + with: + name: documentation + + - name: Setup Pages + uses: actions/configure-pages@v4 + + - name: Upload to GitHub Pages + uses: actions/upload-pages-artifact@v3 + with: + path: website/build + + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 \ No newline at end of file diff --git a/.gitignore b/.gitignore index a61c1ad..d2d1774 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,10 @@ DS_Store .zig-cache/ zig-out/ -doc.md \ No newline at end of file +doc.md +.kiro/ + +# Build artifacts +*.bin +*.yul +*.hir.json \ No newline at end of file diff --git a/GRAMMAR.bnf b/GRAMMAR.bnf new file mode 100644 index 0000000..c6dee8d --- /dev/null +++ b/GRAMMAR.bnf @@ -0,0 +1,358 @@ +# Ora Language Grammar (BNF) +# Version: 0.1.0 +# Description: Formal grammar specification for the Ora smart contract language + +# ========================================== +# TOP-LEVEL PROGRAM STRUCTURE +# ========================================== + +program ::= top_level_declaration* + +top_level_declaration ::= + | contract_declaration + | function_declaration + | variable_declaration + | struct_declaration + | enum_declaration + | log_declaration + | import_declaration + +# ========================================== +# IMPORT DECLARATIONS +# ========================================== + +import_declaration ::= "@" "import" "(" string_literal ")" + +# ========================================== +# CONTRACT DECLARATIONS +# ========================================== + +contract_declaration ::= "contract" identifier "{" contract_member* "}" + +contract_member ::= + | variable_declaration + | function_declaration + | log_declaration + | struct_declaration + | enum_declaration + +# ========================================== +# FUNCTION DECLARATIONS +# ========================================== + +function_declaration ::= visibility? "fn" identifier "(" parameter_list? ")" return_type? requires_clause* ensures_clause* block + +visibility ::= "pub" + +parameter_list ::= parameter ("," parameter)* + +parameter ::= identifier ":" type + +return_type ::= "->" type + +requires_clause ::= "requires" "(" expression ")" ";"? + +ensures_clause ::= "ensures" "(" expression ")" ";"? + +# ========================================== +# VARIABLE DECLARATIONS +# ========================================== + +variable_declaration ::= memory_region? variable_kind identifier ":" type ("=" expression)? ";" + +memory_region ::= "storage" | "memory" | "tstore" + +variable_kind ::= "var" | "let" | "const" | "immutable" + +# ========================================== +# STRUCT DECLARATIONS +# ========================================== + +struct_declaration ::= "struct" identifier "{" struct_member* "}" + +struct_member ::= identifier ":" type ";" + +# ========================================== +# ENUM DECLARATIONS +# ========================================== + +enum_declaration ::= "enum" identifier "{" enum_member_list "}" + +enum_member_list ::= enum_member ("," enum_member)* + +enum_member ::= identifier ("=" expression)? + +# ========================================== +# LOG DECLARATIONS (EVENTS) +# ========================================== + +log_declaration ::= "log" identifier "(" parameter_list? ")" ";" + +# ========================================== +# TYPE SYSTEM +# ========================================== + +type ::= + | primitive_type + | map_type + | doublemap_type + | array_type + | optional_type + | error_union_type + | identifier + +primitive_type ::= + | "u8" | "u16" | "u32" | "u64" | "u128" | "u256" + | "i8" | "i16" | "i32" | "i64" | "i128" | "i256" + | "bool" + | "address" + | "string" + | "bytes" + +map_type ::= "map" "[" type "," type "]" + +doublemap_type ::= "doublemap" "[" type "," type "," type "]" + +array_type ::= "[" type (";" expression)? "]" + +# Array types in Ora: +# [T; N] - Fixed-size array (N elements of type T) +# [T] - Dynamic-size array (variable number of elements) + +optional_type ::= "?" type + +error_union_type ::= type "|" type + +# ========================================== +# STATEMENTS +# ========================================== + +statement ::= + | variable_declaration + | assignment_statement + | compound_assignment_statement + | transfer_statement + | expression_statement + | if_statement + | while_statement + | return_statement + | break_statement + | continue_statement + | log_statement + | lock_statement + | unlock_statement + | try_statement + | block + +assignment_statement ::= expression "=" expression ";" + +compound_assignment_statement ::= expression compound_operator expression ";" + +compound_operator ::= "+=" | "-=" | "*=" + +transfer_statement ::= identifier "from" expression "->" expression ":" expression ";" + +expression_statement ::= expression ";" + +if_statement ::= "if" "(" expression ")" statement ("else" statement)? + +while_statement ::= "while" "(" expression ")" statement + +return_statement ::= "return" expression? ";" + +break_statement ::= "break" ";" + +continue_statement ::= "continue" ";" + +log_statement ::= "log" identifier "(" expression_list? ")" ";" + +lock_statement ::= "@" "lock" "(" expression ")" ";" + +unlock_statement ::= "@" "unlock" "(" expression ")" ";" + +try_statement ::= "try" expression ("catch" identifier block)? + +block ::= "{" statement* "}" + +# ========================================== +# EXPRESSIONS +# ========================================== + +expression ::= assignment_expression + +assignment_expression ::= logical_or_expression assignment_operator* + +assignment_operator ::= "=" | "+=" | "-=" | "*=" + +logical_or_expression ::= logical_and_expression ("|" logical_and_expression)* + +logical_and_expression ::= equality_expression ("&" equality_expression)* + +equality_expression ::= relational_expression (("==" | "!=") relational_expression)* + +relational_expression ::= additive_expression (("<" | "<=" | ">" | ">=") additive_expression)* + +additive_expression ::= multiplicative_expression (("+" | "-") multiplicative_expression)* + +multiplicative_expression ::= unary_expression (("*" | "/" | "%") unary_expression)* + +unary_expression ::= ("!" | "-" | "+")* postfix_expression + +postfix_expression ::= primary_expression postfix_operator* + +postfix_operator ::= + | "." identifier + | "[" expression "]" + | "[" expression "," expression "]" + | "(" expression_list? ")" + +primary_expression ::= + | literal + | identifier + | "(" expression ")" + | old_expression + | comptime_expression + | cast_expression + | error_expression + +old_expression ::= "old" "(" expression ")" + +comptime_expression ::= "comptime" expression + +cast_expression ::= expression "as" type + +error_expression ::= identifier "!" identifier + +expression_list ::= expression ("," expression)* + +# ========================================== +# LITERALS +# ========================================== + +literal ::= + | integer_literal + | string_literal + | boolean_literal + | address_literal + | hex_literal + +integer_literal ::= [0-9]+ + +string_literal ::= "\"" [^"]* "\"" + +boolean_literal ::= "true" | "false" + +address_literal ::= "0x" [0-9a-fA-F]{40} + +hex_literal ::= "0x" [0-9a-fA-F]+ + +# ========================================== +# IDENTIFIERS AND KEYWORDS +# ========================================== + +identifier ::= [a-zA-Z_][a-zA-Z0-9_]* + +# Reserved keywords (cannot be used as identifiers) +keyword ::= + | "contract" | "pub" | "fn" | "let" | "var" | "const" | "immutable" + | "storage" | "memory" | "tstore" | "init" | "log" + | "if" | "else" | "while" | "break" | "continue" | "return" + | "requires" | "ensures" | "invariant" | "old" | "comptime" + | "as" | "import" | "struct" | "enum" | "true" | "false" + | "error" | "try" | "catch" | "from" + | "u8" | "u16" | "u32" | "u64" | "u128" | "u256" + | "i8" | "i16" | "i32" | "i64" | "i128" | "i256" + | "bool" | "address" | "string" | "bytes" + | "map" | "doublemap" + +# ========================================== +# OPERATORS AND PUNCTUATION +# ========================================== + +operator ::= + | "+" | "-" | "*" | "/" | "%" + | "=" | "==" | "!=" | "<" | "<=" | ">" | ">=" + | "!" | "&" | "|" | "^" | "<<" | ">>" + | "+=" | "-=" | "*=" + | "->" + +punctuation ::= + | "(" | ")" | "{" | "}" | "[" | "]" + | "," | ";" | ":" | "." | "@" + +# ========================================== +# WHITESPACE AND COMMENTS +# ========================================== + +whitespace ::= [ \t\n\r]+ + +comment ::= "//" [^\n]* | "/*" .* "*/" + +# ========================================== +# LEXICAL RULES +# ========================================== + +# Tokens are matched in order of precedence: +# 1. Keywords (exact matches) +# 2. Identifiers (alphanumeric + underscore) +# 3. Literals (numbers, strings, addresses, hex) +# 4. Operators (multi-character first, then single-character) +# 5. Punctuation +# 6. Whitespace and comments (ignored) + +# ========================================== +# SEMANTIC CONSTRAINTS (not enforced by grammar) +# ========================================== + +# - Contract must have exactly one 'init' function +# - Storage variables can only be declared at contract level +# - Memory regions have specific scoping rules +# - Type compatibility rules for assignments and operations +# - Function visibility rules +# - Error handling flow control +# - Formal verification clause semantics + +# ========================================== +# PRECEDENCE AND ASSOCIATIVITY +# ========================================== + +# Operator precedence (highest to lowest): +# 1. Postfix operators (., [], ()) +# 2. Unary operators (!, -, +) +# 3. Multiplicative (*, /, %) +# 4. Additive (+, -) +# 5. Relational (<, <=, >, >=) +# 6. Equality (==, !=) +# 7. Logical AND (&) +# 8. Logical OR (|) +# 9. Assignment (=, +=, -=, *=) + +# All binary operators are left-associative +# Assignment operators are right-associative + +# ========================================== +# EXAMPLE PRODUCTIONS +# ========================================== + +# Example contract: +# contract Token { +# storage var balance: u256; +# immutable owner: address; +# +# log Transfer(from: address, to: address, amount: u256); +# +# pub fn init(initial_balance: u256) { +# balance = initial_balance; +# owner = msg.sender; +# } +# +# pub fn transfer(to: address, amount: u256) -> bool +# requires(balance >= amount) +# ensures(balance + to.balance == old(balance) + old(to.balance)) +# { +# balance -= amount; +# balance[to] += amount; +# log Transfer(msg.sender, to, amount); +# return true; +# } +# } \ No newline at end of file diff --git a/GRAMMAR.ebnf b/GRAMMAR.ebnf new file mode 100644 index 0000000..c0a6c3e --- /dev/null +++ b/GRAMMAR.ebnf @@ -0,0 +1,362 @@ +# Ora Language Grammar (EBNF) +# Version: 0.1.0 +# Description: Extended BNF grammar specification for the Ora smart contract language + +# ========================================== +# PROGRAM STRUCTURE +# ========================================== + +Program = { TopLevelDeclaration } ; + +TopLevelDeclaration = + ContractDeclaration + | FunctionDeclaration + | VariableDeclaration + | StructDeclaration + | EnumDeclaration + | LogDeclaration + | ImportDeclaration ; + +# ========================================== +# DECLARATIONS +# ========================================== + +ImportDeclaration = "@" "import" "(" StringLiteral ")" ; + +ContractDeclaration = "contract" Identifier "{" { ContractMember } "}" ; + +ContractMember = + VariableDeclaration + | FunctionDeclaration + | LogDeclaration + | StructDeclaration + | EnumDeclaration ; + +FunctionDeclaration = + [ "pub" ] "fn" Identifier "(" [ ParameterList ] ")" [ ReturnType ] + { RequiresClause } { EnsuresClause } Block ; + +ParameterList = Parameter { "," Parameter } ; + +Parameter = Identifier ":" Type ; + +ReturnType = "->" Type ; + +RequiresClause = "requires" "(" Expression ")" [ ";" ] ; + +EnsuresClause = "ensures" "(" Expression ")" [ ";" ] ; + +VariableDeclaration = + [ MemoryRegion ] VariableKind Identifier ":" Type [ "=" Expression ] ";" ; + +MemoryRegion = "storage" | "memory" | "tstore" ; + +VariableKind = "var" | "let" | "const" | "immutable" ; + +StructDeclaration = "struct" Identifier "{" { StructMember } "}" ; + +StructMember = Identifier ":" Type ";" ; + +EnumDeclaration = "enum" Identifier "{" EnumMemberList "}" ; + +EnumMemberList = EnumMember { "," EnumMember } ; + +EnumMember = Identifier [ "=" Expression ] ; + +LogDeclaration = "log" Identifier "(" [ ParameterList ] ")" ";" ; + +# ========================================== +# TYPE SYSTEM +# ========================================== + +Type = + PrimitiveType + | MapType + | DoublemapType + | ArrayType + | OptionalType + | ErrorUnionType + | Identifier ; + +PrimitiveType = + "u8" | "u16" | "u32" | "u64" | "u128" | "u256" + | "i8" | "i16" | "i32" | "i64" | "i128" | "i256" + | "bool" | "address" | "string" | "bytes" ; + +MapType = "map" "[" Type "," Type "]" ; + +DoublemapType = "doublemap" "[" Type "," Type "," Type "]" ; + +ArrayType = "[" Type [ ";" Expression ] "]" ; + +OptionalType = "?" Type ; + +ErrorUnionType = Type "|" Type ; + +# ========================================== +# STATEMENTS +# ========================================== + +Statement = + VariableDeclaration + | AssignmentStatement + | CompoundAssignmentStatement + | TransferStatement + | ExpressionStatement + | IfStatement + | WhileStatement + | ReturnStatement + | BreakStatement + | ContinueStatement + | LogStatement + | LockStatement + | UnlockStatement + | TryStatement + | Block ; + +AssignmentStatement = Expression "=" Expression ";" ; + +CompoundAssignmentStatement = Expression CompoundOperator Expression ";" ; + +CompoundOperator = "+=" | "-=" | "*=" ; + +TransferStatement = Identifier "from" Expression "->" Expression ":" Expression ";" ; + +ExpressionStatement = Expression ";" ; + +IfStatement = "if" "(" Expression ")" Statement [ "else" Statement ] ; + +WhileStatement = "while" "(" Expression ")" Statement ; + +ReturnStatement = "return" [ Expression ] ";" ; + +BreakStatement = "break" ";" ; + +ContinueStatement = "continue" ";" ; + +LogStatement = "log" Identifier "(" [ ExpressionList ] ")" ";" ; + +LockStatement = "@" "lock" "(" Expression ")" ";" ; + +UnlockStatement = "@" "unlock" "(" Expression ")" ";" ; + +TryStatement = "try" Expression [ "catch" Identifier Block ] ; + +Block = "{" { Statement } "}" ; + +# ========================================== +# EXPRESSIONS (with precedence) +# ========================================== + +Expression = AssignmentExpression ; + +AssignmentExpression = LogicalOrExpression { AssignmentOperator LogicalOrExpression } ; + +AssignmentOperator = "=" | "+=" | "-=" | "*=" ; + +LogicalOrExpression = LogicalAndExpression { "|" LogicalAndExpression } ; + +LogicalAndExpression = EqualityExpression { "&" EqualityExpression } ; + +EqualityExpression = RelationalExpression { ( "==" | "!=" ) RelationalExpression } ; + +RelationalExpression = AdditiveExpression { ( "<" | "<=" | ">" | ">=" ) AdditiveExpression } ; + +AdditiveExpression = MultiplicativeExpression { ( "+" | "-" ) MultiplicativeExpression } ; + +MultiplicativeExpression = UnaryExpression { ( "*" | "/" | "%" ) UnaryExpression } ; + +UnaryExpression = { ( "!" | "-" | "+" ) } PostfixExpression ; + +PostfixExpression = PrimaryExpression { PostfixOperator } ; + +PostfixOperator = + "." Identifier + | "[" Expression "]" + | "[" Expression "," Expression "]" + | "(" [ ExpressionList ] ")" ; + +PrimaryExpression = + Literal + | Identifier + | "(" Expression ")" + | OldExpression + | ComptimeExpression + | CastExpression + | ErrorExpression ; + +OldExpression = "old" "(" Expression ")" ; + +ComptimeExpression = "comptime" Expression ; + +CastExpression = Expression "as" Type ; + +ErrorExpression = Identifier "!" Identifier ; + +ExpressionList = Expression { "," Expression } ; + +# ========================================== +# LITERALS +# ========================================== + +Literal = + IntegerLiteral + | StringLiteral + | BooleanLiteral + | AddressLiteral + | HexLiteral ; + +IntegerLiteral = Digit { Digit } ; + +StringLiteral = '"' { Character - '"' } '"' ; + +BooleanLiteral = "true" | "false" ; + +AddressLiteral = "0x" HexDigit HexDigit HexDigit HexDigit HexDigit HexDigit HexDigit HexDigit + HexDigit HexDigit HexDigit HexDigit HexDigit HexDigit HexDigit HexDigit + HexDigit HexDigit HexDigit HexDigit HexDigit HexDigit HexDigit HexDigit + HexDigit HexDigit HexDigit HexDigit HexDigit HexDigit HexDigit HexDigit + HexDigit HexDigit HexDigit HexDigit HexDigit HexDigit HexDigit HexDigit ; + +HexLiteral = "0x" { HexDigit } ; + +# ========================================== +# LEXICAL ELEMENTS +# ========================================== + +Identifier = ( Letter | "_" ) { Letter | Digit | "_" } ; + +Letter = "a" | "b" | "c" | "d" | "e" | "f" | "g" | "h" | "i" | "j" | "k" | "l" | "m" | + "n" | "o" | "p" | "q" | "r" | "s" | "t" | "u" | "v" | "w" | "x" | "y" | "z" | + "A" | "B" | "C" | "D" | "E" | "F" | "G" | "H" | "I" | "J" | "K" | "L" | "M" | + "N" | "O" | "P" | "Q" | "R" | "S" | "T" | "U" | "V" | "W" | "X" | "Y" | "Z" ; + +Digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ; + +HexDigit = Digit | "a" | "b" | "c" | "d" | "e" | "f" | "A" | "B" | "C" | "D" | "E" | "F" ; + +Character = ? any Unicode character ? ; + +# ========================================== +# COMMENTS AND WHITESPACE +# ========================================== + +Comment = LineComment | BlockComment ; + +LineComment = "//" { Character - NewLine } NewLine ; + +BlockComment = "/*" { Character } "*/" ; + +NewLine = ? line feed character ? ; + +Whitespace = ? space, tab, newline, carriage return ? ; + +# ========================================== +# RESERVED WORDS +# ========================================== + +ReservedWord = + "contract" | "pub" | "fn" | "let" | "var" | "const" | "immutable" | + "storage" | "memory" | "tstore" | "init" | "log" | + "if" | "else" | "while" | "break" | "continue" | "return" | + "requires" | "ensures" | "invariant" | "old" | "comptime" | + "as" | "import" | "struct" | "enum" | "true" | "false" | + "error" | "try" | "catch" | "from" | + "u8" | "u16" | "u32" | "u64" | "u128" | "u256" | + "i8" | "i16" | "i32" | "i64" | "i128" | "i256" | + "bool" | "address" | "string" | "bytes" | "map" | "doublemap" ; + +# ========================================== +# GRAMMAR VALIDATION EXAMPLES +# ========================================== + +# Example 1: Simple contract +(* +contract SimpleStorage { + storage var value: u256; + + pub fn init(initial_value: u256) { + value = initial_value; + } + + pub fn get() -> u256 { + return value; + } + + pub fn set(new_value: u256) { + value = new_value; + } +} +*) + +# Example 2: ERC20 Token with verification +(* +contract Token { + storage var totalSupply: u256; + storage var balances: map[address, u256]; + + log Transfer(from: address, to: address, amount: u256); + + pub fn init(initial_supply: u256) { + totalSupply = initial_supply; + balances[msg.sender] = initial_supply; + } + + pub fn transfer(to: address, amount: u256) -> bool + requires(balances[msg.sender] >= amount) + requires(to != 0x0) + ensures(balances[msg.sender] + balances[to] == old(balances[msg.sender]) + old(balances[to])) + { + balances[msg.sender] -= amount; + balances[to] += amount; + log Transfer(msg.sender, to, amount); + return true; + } +} +*) + +# Example 3: Error handling +(* +contract SafeMath { + error DivisionByZero; + error Overflow; + + pub fn safe_divide(a: u256, b: u256) -> u256 | DivisionByZero { + if (b == 0) { + return DivisionByZero; + } + return a / b; + } + + pub fn safe_add(a: u256, b: u256) -> u256 | Overflow { + if (a + b < a) { + return Overflow; + } + return a + b; + } +} +*) + +# ========================================== +# SEMANTIC NOTES +# ========================================== + +# 1. Identifiers cannot be reserved words +# 2. Memory region annotations have scoping rules +# 3. Type compatibility must be checked during semantic analysis +# 4. Function signatures must be unique within a contract +# 5. Storage variables can only be declared at contract level +# 6. Formal verification clauses have specific semantic requirements +# 7. Error unions create sum types that must be handled +# 8. Transfer statements are syntactic sugar for balance updates + +# ========================================== +# AMBIGUITY RESOLUTION +# ========================================== + +# 1. Dangling else: Associates with nearest if +# 2. Operator precedence: As defined in expression hierarchy +# 3. Assignment associativity: Right-associative +# 4. Function calls vs array indexing: Disambiguated by context +# 5. Type annotations: Required for variable declarations +# 6. Block scoping: Lexical scoping rules apply \ No newline at end of file diff --git a/HIR_SPEC.md b/HIR_SPEC.md new file mode 100644 index 0000000..e8cfa56 --- /dev/null +++ b/HIR_SPEC.md @@ -0,0 +1,226 @@ +# Ora HIR (High-level Intermediate Representation) Specification + +## Overview + +The Ora HIR bridges the AST and codegen phases. It models validated, effect-aware, and optimizable program structure. + +### Key Features +- **Explicit effect tracking** +- **Memory region modeling** +- **Strong type system** +- **Formal verification support** +- **Optimizer-friendly** +- **Error union/result support** +- **Dynamic symbol tracking** + +## Design Principles +1. **Explicit behavior modeling** +2. **Immutable HIR nodes** +3. **Must validate before codegen** +4. **All effects are tracked** +5. **Memory safety enforced** +6. **Simplicity over complexity** +7. **Accurate program behavior modeling** + +## Memory Model + +```zig +enum Region { + stack, memory, storage, tstore, const_, immutable +} +``` + +| Region | Lifetime | Mutability | Gas Cost | Use Case | +|--------|----------|------------|----------|----------| +| stack | Function | Variable | Low | Local vars | +| memory | Transaction | Variable | Medium | Temporary buffers | +| storage | Persistent | Variable | High | Contract state | +| tstore | Transaction | Variable | Medium | Transient state | +| const_ | Compile-time | Immutable | None | Constants | +| immutable | Deployment | Immutable | Low | Init-only contract vars | + +## Type System + +```zig +enum PrimitiveType { + u8, u16, u32, u64, u128, u256, + bool, address, string +} + +union Type { + primitive: PrimitiveType, + mapping: MappingType, + slice: SliceType, + custom: CustomType, + error_union: ErrorUnionType, + result: ResultType +} +``` + +## Node Structure + +### HIRProgram +```zig +struct HIRProgram { + version: string, + contracts: []Contract, + allocator: Allocator +} +``` + +### Contract +```zig +struct Contract { + name: string, + storage: []StorageVariable, + functions: []Function, + events: []Event, + allocator: Allocator +} +``` + +### Function +```zig +struct Function { + name: string, + visibility: Visibility, + parameters: []Parameter, + return_type: ?Type, + requires: []Expression, + ensures: []Expression, + body: Block, + state_effects: EffectSet, + observable_effects: EffectSet, + effects: FunctionEffects, + location: SourceLocation, + allocator: Allocator +} +``` + +### FunctionEffects +```zig +struct FunctionEffects { + writes_storage: bool, + reads_storage: bool, + writes_transient: bool, + reads_transient: bool, + emits_logs: bool, + calls_other: bool, + modifies_state: bool, + is_pure: bool +} +``` + +## Expressions +```zig +union Expression { + binary, unary, call, index, field, transfer, shift, + old, literal, identifier, try_expr, error_value, error_cast +} +``` + +## Statements +```zig +union Statement { + variable_decl, assignment, compound_assignment, if_statement, + while_statement, return_statement, expression_statement, + lock_statement, unlock_statement, error_decl, + try_statement, error_return +} +``` + +## Effect System + +### Effect +```zig +struct Effect { + type: EffectType, + path: AccessPath, + condition: ?Expression +} +``` + +### AccessPath +```zig +struct AccessPath { + base: string, + selectors: []PathSelector, + region: Region +} +``` + +### PathSelector +```zig +union PathSelector { + field: { name: string }, + index: { index: Expression } +} +``` + +## Effect Analysis +- **Symbol tables are rebuilt per contract** +- **All expressions and statements are walked** +- **Effects are computed recursively** +- **Computed metadata:** + +```zig +modifies_state = writes_storage || writes_transient || emits_logs +is_pure = !(writes_storage || reads_storage || writes_transient || reads_transient || emits_logs || calls_other) +``` + +## Validation Rules +- **All expressions must be typed** +- **Assignments must be type-compatible** +- **Function args must match params** +- **Index ops must match container types** +- **All effects must be consistent with requires/ensures** +- **Return paths must be valid** +- **Invariants must be stated on loops** +- **Error branches must be handled or propagated** + +## Optimization Framework + +```zig +struct OptimizationPass { + name: string, + run: fn(*HIRProgram, Allocator) -> anyerror!void +} +``` + +**Standard passes:** +1. **Dead code elimination** +2. **Constant folding** +3. **Effect optimization** +4. **Gas optimization** + +## JSON Serialization +- **HIR serializes to JSON for tooling/debugging** +- **Effects included as simple flags** +- **Example:** + +```json +{ + "name": "transfer", + "effects": { + "writes_storage": true, + "emits_logs": true, + "is_pure": false + } +} +``` + +## Examples +- **Functions include requires/ensures, effects, and visibility** +- **Effect detection captures index, mapping, struct, etc.** +- **Storage access modeled via AccessPath** +- **Transfer/balance checks modeled as state reads/writes** + +## Implementation Notes +- **All HIR nodes use allocators** +- **Every node includes source location** +- **Effects tracked both structurally and via summary flags** +- **Per-contract symbol isolation required** + +## Extensions +- **Future: cross-contract effects, verification output, gas metrics** +- **Lock/Transfer annotations may decorate functions with semantic guarantees** \ No newline at end of file diff --git a/README.md b/README.md index 81b3037..0f08fae 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,32 @@ -# Ora +# Ora Development Notebook -A domain-specific language for smart contract development with formal verification capabilities. +An experimental smart contract language with formal verification capabilities. -> **⚠️ Development Status**: This project is under active development. Many features are still being implemented and the API may change. +> **🚧 EXPERIMENTAL PROJECT**: Ora is NOT ready for production use. This repository serves as an open notebook documenting language design and implementation progress. Features, syntax, and APIs are subject to change without notice. ## Overview -Ora is a modern smart contract language that compiles to Yul (Ethereum's intermediate language) and EVM bytecode. Built with Zig, it provides safety guarantees through formal verification while maintaining high performance and developer productivity. +Ora is an experimental smart contract language that compiles to Yul (Ethereum's intermediate language) and EVM bytecode. Built with Zig, it aims to provide safety guarantees through formal verification while maintaining high performance and developer productivity. -## Key Features +## Development Status -- **Formal Verification**: Built-in mathematical proof capabilities for complex conditions and quantifiers *(in development)* -- **Multi-Phase Compilation**: Lexical analysis → Syntax analysis → Semantic analysis → HIR → Yul → Bytecode -- **Safe by Design**: Memory safety, type safety, and overflow protection *(in development)* -- **Ethereum Integration**: Direct compilation to EVM bytecode via Yul intermediate representation -- **Modern Syntax**: Clean, readable syntax inspired by Rust and Zig +### ✅ Currently Functional +- Core compilation pipeline: Lexical analysis → Syntax analysis → Semantic analysis → HIR → Yul → Bytecode +- Basic smart contract syntax and compilation +- Yul code generation and EVM bytecode output +- Error handling foundations -> **🚧 Implementation Status**: Core compilation pipeline is functional. Advanced features like formal verification and comprehensive safety checks are being actively developed. +### 🚧 In Active Development +- **Formal Verification**: Mathematical proof capabilities for complex conditions and quantifiers +- **Advanced Safety**: Memory safety, type safety, and overflow protection +- **Comprehensive Error Handling**: Full `!T` error union implementation +- **Standard Library**: Core utilities and common patterns + +### 📋 Planned Features +- Compile-time evaluation optimizations +- Advanced type system features +- IDE integration and tooling +- Comprehensive testing frameworks ## Quick Start @@ -43,13 +53,13 @@ zig build zig build test ``` -### Your First Contract +### Try Current Implementation -Create a simple storage contract (`storage.ora`): +Create a simple storage contract (`test.ora`): ```ora contract SimpleStorage { - var value: u256; + storage var value: u256; pub fn set(new_value: u256) { value = new_value; @@ -61,28 +71,46 @@ contract SimpleStorage { } ``` -Compile to bytecode: +Compile it: ```bash -./zig-out/bin/ora compile storage.ora +./zig-out/bin/ora test.ora ``` -## Language Features - -### Storage and State Management +## Language Features (Current) +### Basic Contract Structure ```ora -contract Token { - let name: string; - var total_supply: u256; - var balances: mapping[address, u256]; +contract MyContract { + storage var balance: u256; + immutable owner: address; + storage const MAX_SUPPLY: u256 = 1000000; + + pub fn transfer(to: address, amount: u256) -> bool { + // Implementation + return true; + } } ``` -### Formal Verification +### Error Handling (In Development) +```ora +error InsufficientBalance; +error InvalidAddress; +fn transfer(to: address, amount: u256) -> !u256 { + if (balance < amount) { + return error.InsufficientBalance; + } + + balance -= amount; + return balance; +} +``` + +### Formal Verification (Planned) ```ora -function transfer(to: address, amount: u256) -> bool +fn transfer(to: address, amount: u256) -> bool requires balances[sender] >= amount ensures balances[sender] + balances[to] == old(balances[sender]) + old(balances[to]) { @@ -92,106 +120,79 @@ function transfer(to: address, amount: u256) -> bool } ``` -> **⚠️ Note**: Formal verification syntax is still being finalized and may not be fully functional yet. +## Project Structure -### Error Handling - -```ora -function safe_divide(a: u256, b: u256) -> u256 | DivisionError { - if (b == 0) { - return DivisionError.DivisionByZero; - } - return a / b; -} ``` - -## CLI Usage - -```bash -# Full compilation pipeline -ora compile contract.ora - -# Individual phases -ora lex contract.ora # Tokenization -ora parse contract.ora # AST generation -ora analyze contract.ora # Semantic analysis -ora hir contract.ora # HIR generation -ora yul contract.ora # Yul generation -ora bytecode contract.ora # Bytecode generation +Ora/ +├── src/ # Compiler implementation (Zig) +│ ├── ast.zig # Abstract Syntax Tree +│ ├── parser.zig # Syntax analysis +│ ├── semantic.zig # Semantic analysis +│ ├── hir.zig # High-level IR +│ └── codegen_yul.zig # Yul code generation +├── examples/ # Working code examples +│ ├── core/ # Basic functionality +│ ├── advanced/ # Advanced features (experimental) +│ └── tokens/ # Token contract patterns +├── docs/ # Technical specifications +│ ├── GRAMMAR.bnf # Language grammar +│ ├── HIR_SPEC.md # IR specification +│ └── formal-verification.md +├── website/ # Documentation site +└── vendor/solidity/ # Solidity integration ``` -## Examples +## Documentation -The `examples/` directory contains various contract examples: +- **Website**: [ora-lang.org](https://ora-lang.org) - Development notebook and documentation +- **Examples**: Browse `examples/` directory for working code patterns +- **Grammar**: See `GRAMMAR.bnf` for current syntax specification +- **API**: Check `API.md` for compiler interface -- **Simple Storage**: Basic state management -- **ERC20 Token**: Standard token implementation -- **Formal Verification**: Advanced proof examples -- **Error Handling**: Comprehensive error management -- **Optimization**: Performance optimization patterns +## Development Notes -## Architecture +### Technical Decisions -### Compilation Pipeline +- **Zig as Implementation Language**: Leverages compile-time capabilities for meta-programming +- **Yul Backend**: Compiles to Ethereum's intermediate language for optimal bytecode generation +- **Multi-Phase Compilation**: Separate lexical, syntax, semantic, and code generation phases +- **Formal Verification Focus**: Designing for mathematical proof capabilities from the ground up -1. **Lexer** (`src/lexer.zig`) - Tokenizes source code -2. **Parser** (`src/parser.zig`) - Generates Abstract Syntax Tree -3. **Semantic Analyzer** (`src/semantics.zig`) - Type checking and validation -4. **HIR Builder** (`src/ir.zig`) - High-level Intermediate Representation -5. **Yul Codegen** (`src/codegen_yul.zig`) - Yul code generation -6. **Bytecode Generation** - EVM bytecode via Solidity integration +### Current Limitations -### Formal Verification +- No standard library implementation yet +- Limited error messages and debugging information +- Incomplete type system (basic types only) +- No formal verification execution (syntax defined but not implemented) +- Minimal testing framework -The formal verification system supports: -- **Proof Strategies**: Direct proof, contradiction, induction, case analysis -- **Mathematical Domains**: Integer, real, bit-vector, array, set operations -- **Quantifiers**: Universal (∀) and existential (∃) quantification -- **SMT Integration**: Z3, CVC4, Yices solver support +### Not Suitable For -## Development +- Production smart contracts +- Financial applications +- Critical infrastructure +- Projects requiring stable APIs +- Applications needing comprehensive tooling -### Project Structure +## Contributing -``` -oralang/ -├── src/ # Compiler source code -├── examples/ # Example contracts -├── vendor/solidity/ # Solidity libraries (submodule) -├── build.zig # Zig build configuration -└── README.md # This file -``` +This is an experimental research project. Ways to contribute: -### Building with Debug Info +1. **Report Issues**: File bugs for unexpected behavior +2. **Suggest Improvements**: Discuss language design decisions +3. **Submit Examples**: Share interesting contract patterns +4. **Improve Documentation**: Help expand this development notebook -```bash -zig build -Doptimize=Debug -``` +## Community -### Running Examples - -```bash -# Parser demo -zig build parser-demo - -# Yul integration test -zig build yul-test - -# Optimization demo -zig build optimization-demo - -# Formal verification demo -zig build formal-verification-demo -``` +- **Source Code**: [GitHub Repository](https://github.com/oralang/Ora) +- **Issues**: [Bug Reports & Feature Requests](https://github.com/oralang/Ora/issues) +- **Discussions**: [GitHub Discussions](https://github.com/oralang/Ora/discussions) ## License -This project is licensed under the GPL-3.0 License - see the [LICENSE](LICENSE) file for details. - -## Documentation +This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details. -- [API Documentation](API.md) -- [Formal Verification Guide](formal-verification.md) -- [Syntax Guide](syntax-guide.md) +--- -> **📝 Note**: Some documentation is still being written. \ No newline at end of file +*Last updated: December 2024 - Reflects current development status* \ No newline at end of file diff --git a/examples/comptime_test.ora b/examples/advanced/comptime_test.ora similarity index 100% rename from examples/comptime_test.ora rename to examples/advanced/comptime_test.ora diff --git a/examples/error_union_demo.ora b/examples/advanced/error_union_demo.ora similarity index 98% rename from examples/error_union_demo.ora rename to examples/advanced/error_union_demo.ora index 7691648..b717532 100644 --- a/examples/error_union_demo.ora +++ b/examples/advanced/error_union_demo.ora @@ -10,7 +10,7 @@ contract ErrorUnionDemo { error AmountTooLarge; // Storage variables - storage balances: mapping[address, u256]; + storage balances: map[address, u256]; storage owner: address; // Initialize contract diff --git a/examples/formal_verification_test.ora b/examples/advanced/formal_verification_test.ora similarity index 97% rename from examples/formal_verification_test.ora rename to examples/advanced/formal_verification_test.ora index aaa825c..ff7d799 100644 --- a/examples/formal_verification_test.ora +++ b/examples/advanced/formal_verification_test.ora @@ -4,8 +4,8 @@ contract MathematicalProofs { // Storage for mathematical operations storage values: u256[]; - storage prime_cache: mapping(u256 => bool); - storage factorial_cache: mapping(u256 => u256); + storage prime_cache: map[u256, bool]; +storage factorial_cache: map[u256, u256]; // Complex mathematical invariant with quantifiers invariant forall i: u256 where i < values.length => values[i] > 0; @@ -279,8 +279,8 @@ contract MathematicalProofs { // Contract demonstrating formal verification of complex business logic contract VotingSystem { - storage proposals: mapping(u256 => Proposal); - storage voters: mapping(address => Voter); + storage proposals: map[u256, Proposal]; +storage voters: map[address, Voter]; storage proposal_count: u256; struct Proposal { @@ -291,7 +291,7 @@ contract VotingSystem { } struct Voter { - has_voted: mapping(u256 => bool); + has_voted: map[u256, bool]; voting_power: u256; } diff --git a/examples/optimization_test.ora b/examples/advanced/optimization_test.ora similarity index 99% rename from examples/optimization_test.ora rename to examples/advanced/optimization_test.ora index bb84f1e..936a48a 100644 --- a/examples/optimization_test.ora +++ b/examples/advanced/optimization_test.ora @@ -6,7 +6,7 @@ contract OptimizationDemo { storage const ALWAYS_FALSE: bool = false; // State variables - storage var balances: mapping[address, u256]; + storage var balances: map[address, u256]; storage var total_supply: u256; storage var is_paused: bool; diff --git a/examples/verification_test.ora b/examples/advanced/verification_test.ora similarity index 99% rename from examples/verification_test.ora rename to examples/advanced/verification_test.ora index 6f7e2c0..06499c9 100644 --- a/examples/verification_test.ora +++ b/examples/advanced/verification_test.ora @@ -4,7 +4,7 @@ contract VerificationDemo { storage const MAX_TRANSFER: u256 = 1000000; // State variables - storage var balances: mapping[address, u256]; + storage var balances: map[address, u256]; storage var total_supply: u256; log Transfer(from: address, to: address, amount: u256); diff --git a/examples/verification_with_old.ora b/examples/advanced/verification_with_old.ora similarity index 100% rename from examples/verification_with_old.ora rename to examples/advanced/verification_with_old.ora diff --git a/examples/control_flow_simple.ora b/examples/core/control_flow_simple.ora similarity index 100% rename from examples/control_flow_simple.ora rename to examples/core/control_flow_simple.ora diff --git a/examples/control_flow_test.ora b/examples/core/control_flow_test.ora similarity index 100% rename from examples/control_flow_test.ora rename to examples/core/control_flow_test.ora diff --git a/examples/simple_parser_test.ora b/examples/core/simple_parser_test.ora similarity index 93% rename from examples/simple_parser_test.ora rename to examples/core/simple_parser_test.ora index b6ce28c..30dab46 100644 --- a/examples/simple_parser_test.ora +++ b/examples/core/simple_parser_test.ora @@ -1,7 +1,7 @@ contract SimpleToken { // Storage variables storage var totalSupply: u256; - storage var balances: mapping[address, u256]; + storage var balances: map[address, u256]; // Events log Transfer(from: address, to: address, amount: u256); diff --git a/examples/simple_storage_test.ora b/examples/core/simple_storage_test.ora similarity index 100% rename from examples/simple_storage_test.ora rename to examples/core/simple_storage_test.ora diff --git a/examples/simple_test.ora b/examples/core/simple_test.ora similarity index 100% rename from examples/simple_test.ora rename to examples/core/simple_test.ora diff --git a/examples/debug/debug_type_mismatch.ora b/examples/debug/debug_type_mismatch.ora new file mode 100644 index 0000000..6e3e6ed --- /dev/null +++ b/examples/debug/debug_type_mismatch.ora @@ -0,0 +1,7 @@ +contract TypeMismatchTest { + let sum: i32 = 10 + (-5); // Arithmetic with negative + + pub fn init() { + // Empty init + } +} \ No newline at end of file diff --git a/examples/debug/incremental_test.ora b/examples/debug/incremental_test.ora new file mode 100644 index 0000000..33059ae --- /dev/null +++ b/examples/debug/incremental_test.ora @@ -0,0 +1,10 @@ +// Testing imports first +@import("std/crypto") + +contract TestContract { + storage var value: u256; + + pub fn init() { + value = 0; + } +} \ No newline at end of file diff --git a/examples/ast_demo.zig b/examples/demos/ast_demo.zig similarity index 100% rename from examples/ast_demo.zig rename to examples/demos/ast_demo.zig diff --git a/examples/comptime_demo.zig b/examples/demos/comptime_demo.zig similarity index 100% rename from examples/comptime_demo.zig rename to examples/demos/comptime_demo.zig diff --git a/examples/demos/division_comprehensive_test.ora b/examples/demos/division_comprehensive_test.ora new file mode 100644 index 0000000..9ff568d --- /dev/null +++ b/examples/demos/division_comprehensive_test.ora @@ -0,0 +1,273 @@ +// Comprehensive Division Function Test Suite +// Tests all Zig-inspired division operations with edge cases and error handling + +contract DivisionTestSuite { + // Error declarations + error DivisionByZero; + error InexactDivision; + error OverflowError; + error TestFailed; + + // Test results storage + storage test_results: map[string, bool]; + storage test_count: u32; + storage passed_count: u32; + + // Initialize test suite + fn init() { + test_count = 0; + passed_count = 0; + } + + // Run all tests + function runAllTests() public { + log("=== Running Comprehensive Division Tests ==="); + + // Basic division tests + testBasicTruncDivision(); + testBasicFloorDivision(); + testBasicCeilDivision(); + testBasicExactDivision(); + testBasicDivmod(); + + // Edge case tests + testEdgeCases(); + + // Error handling tests + testErrorHandling(); + + // Compile-time evaluation tests + testComptimeEvaluation(); + + // Performance tests + testPerformance(); + + // Report results + reportResults(); + } + + // Test @divTrunc function + function testBasicTruncDivision() public { + log("Testing @divTrunc..."); + + // Positive numbers + assert(@divTrunc(10, 3) == 3, "10 / 3 should be 3"); + assert(@divTrunc(15, 4) == 3, "15 / 4 should be 3"); + assert(@divTrunc(20, 5) == 4, "20 / 5 should be 4"); + + // Negative numbers (truncate toward zero) + assert(@divTrunc(-10, 3) == -3, "-10 / 3 should be -3"); + assert(@divTrunc(10, -3) == -3, "10 / -3 should be -3"); + assert(@divTrunc(-10, -3) == 3, "-10 / -3 should be 3"); + + recordTestResult("divTrunc_basic", true); + } + + // Test @divFloor function + function testBasicFloorDivision() public { + log("Testing @divFloor..."); + + // Positive numbers (same as truncate) + assert(@divFloor(10, 3) == 3, "10 // 3 should be 3"); + assert(@divFloor(15, 4) == 3, "15 // 4 should be 3"); + + // Negative numbers (floor toward -∞) + assert(@divFloor(-10, 3) == -4, "-10 // 3 should be -4"); + assert(@divFloor(10, -3) == -4, "10 // -3 should be -4"); + assert(@divFloor(-10, -3) == 3, "-10 // -3 should be 3"); + + recordTestResult("divFloor_basic", true); + } + + // Test @divCeil function + function testBasicCeilDivision() public { + log("Testing @divCeil..."); + + // Positive numbers (ceiling toward +∞) + assert(@divCeil(10, 3) == 4, "ceil(10 / 3) should be 4"); + assert(@divCeil(15, 4) == 4, "ceil(15 / 4) should be 4"); + assert(@divCeil(20, 5) == 4, "ceil(20 / 5) should be 4"); + + // Negative numbers + assert(@divCeil(-10, 3) == -3, "ceil(-10 / 3) should be -3"); + assert(@divCeil(10, -3) == -3, "ceil(10 / -3) should be -3"); + assert(@divCeil(-10, -3) == 4, "ceil(-10 / -3) should be 4"); + + recordTestResult("divCeil_basic", true); + } + + // Test @divExact function + function testBasicExactDivision() public { + log("Testing @divExact..."); + + // Exact divisions should work + assert(@divExact(20, 5) == 4, "20 / 5 should be exactly 4"); + assert(@divExact(100, 25) == 4, "100 / 25 should be exactly 4"); + assert(@divExact(-20, 5) == -4, "-20 / 5 should be exactly -4"); + + recordTestResult("divExact_basic", true); + } + + // Test @divmod function with tuple unpacking + function testBasicDivmod() public { + log("Testing @divmod with tuple unpacking..."); + + // Basic divmod + let (q1, r1) = @divmod(10, 3); + assert(q1 == 3, "10 divmod 3 quotient should be 3"); + assert(r1 == 1, "10 divmod 3 remainder should be 1"); + + let (q2, r2) = @divmod(15, 4); + assert(q2 == 3, "15 divmod 4 quotient should be 3"); + assert(r2 == 3, "15 divmod 4 remainder should be 3"); + + // Negative numbers + let (q3, r3) = @divmod(-10, 3); + assert(q3 == -3, "-10 divmod 3 quotient should be -3"); + assert(r3 == -1, "-10 divmod 3 remainder should be -1"); + + recordTestResult("divmod_basic", true); + } + + // Test edge cases + function testEdgeCases() public { + log("Testing edge cases..."); + + // Division by 1 + assert(@divTrunc(42, 1) == 42, "42 / 1 should be 42"); + assert(@divFloor(42, 1) == 42, "42 // 1 should be 42"); + assert(@divCeil(42, 1) == 42, "ceil(42 / 1) should be 42"); + + // Division resulting in 0 + assert(@divTrunc(2, 5) == 0, "2 / 5 should be 0"); + assert(@divFloor(2, 5) == 0, "2 // 5 should be 0"); + assert(@divCeil(2, 5) == 1, "ceil(2 / 5) should be 1"); + + // Self division + assert(@divTrunc(7, 7) == 1, "7 / 7 should be 1"); + assert(@divExact(7, 7) == 1, "7 / 7 should be exactly 1"); + + let (q, r) = @divmod(7, 7); + assert(q == 1 && r == 0, "7 divmod 7 should be (1, 0)"); + + recordTestResult("edge_cases", true); + } + + // Test error handling + function testErrorHandling() public { + log("Testing error handling..."); + + // Test division by zero error handling + try { + let result = @divTrunc(10, 0); + recordTestResult("divzero_error", false); // Should not reach here + } catch(err) { + // Division by zero should be caught + recordTestResult("divzero_error", true); + } + + // Test inexact division error handling + try { + let result = @divExact(10, 3); // Not exact + recordTestResult("inexact_error", false); // Should not reach here + } catch(err) { + // Inexact division should be caught + recordTestResult("inexact_error", true); + } + + // Test safe division wrapper + let safe_result = safeDivision(10, 3); + recordTestResult("safe_division", true); + } + + // Test compile-time evaluation + function testComptimeEvaluation() public { + log("Testing compile-time evaluation..."); + + comptime { + // All these should be computed at compile time + let ct_trunc = @divTrunc(100, 7); // 14 + let ct_floor = @divFloor(100, 7); // 14 + let ct_ceil = @divCeil(100, 7); // 15 + let ct_exact = @divExact(100, 25); // 4 + let (ct_q, ct_r) = @divmod(100, 7); // (14, 2) + + // Verify compile-time results + assert(ct_trunc == 14, "Comptime trunc failed"); + assert(ct_floor == 14, "Comptime floor failed"); + assert(ct_ceil == 15, "Comptime ceil failed"); + assert(ct_exact == 4, "Comptime exact failed"); + assert(ct_q == 14 && ct_r == 2, "Comptime divmod failed"); + } + + recordTestResult("comptime_eval", true); + } + + // Test performance characteristics + function testPerformance() public { + log("Testing performance..."); + + // Test with various input sizes + let large_a: u64 = 1000000; + let large_b: u64 = 7; + + let perf_trunc = @divTrunc(large_a, large_b); + let perf_floor = @divFloor(large_a, large_b); + let perf_ceil = @divCeil(large_a, large_b); + let (perf_q, perf_r) = @divmod(large_a, large_b); + + // Verify consistency + assert(perf_trunc == perf_floor, "Large number trunc/floor should match"); + assert(perf_ceil == perf_trunc + 1, "Large number ceil should be trunc + 1"); + assert(perf_q == perf_trunc, "Large number divmod quotient should match trunc"); + + recordTestResult("performance", true); + } + + // Safe division wrapper function + function safeDivision(a: u32, b: u32) -> !u32 { + if (b == 0) { + return error.DivisionByZero; + } + + return @divTrunc(a, b); + } + + // Helper function to record test results + function recordTestResult(test_name: string, passed: bool) { + test_results[test_name] = passed; + test_count = test_count + 1; + + if (passed) { + passed_count = passed_count + 1; + log("✓ ", test_name, " PASSED"); + } else { + log("✗ ", test_name, " FAILED"); + } + } + + // Helper assert function + function assert(condition: bool, message: string) { + if (!condition) { + log("ASSERTION FAILED: ", message); + // In a real implementation, this would throw an error + } + } + + // Report final test results + function reportResults() public { + log("=== Test Results Summary ==="); + log("Total tests: ", test_count); + log("Passed: ", passed_count); + log("Failed: ", test_count - passed_count); + + let success_rate = (passed_count * 100) / test_count; + log("Success rate: ", success_rate, "%"); + + if (passed_count == test_count) { + log("🎉 All tests passed!"); + } else { + log("❌ Some tests failed."); + } + } +} \ No newline at end of file diff --git a/examples/demos/division_test.ora b/examples/demos/division_test.ora new file mode 100644 index 0000000..cab54c3 --- /dev/null +++ b/examples/demos/division_test.ora @@ -0,0 +1,95 @@ +contract DivisionDemo { + // Error declarations for division operations + error DivisionByZero; + error InexactDivision; + error OverflowError; + + // Test the new Zig-inspired division functions + + function testDivisionFunctions() public { + let a: u32 = 10; + let b: u32 = 3; + + // Truncating division (toward zero) - EVM default + let trunc_result = @divTrunc(a, b); // 3 + + // Floor division (toward negative infinity) + let floor_result = @divFloor(a, b); // 3 + + // Ceiling division (toward positive infinity) + let ceil_result = @divCeil(a, b); // 4 + + // Exact division (errors if remainder != 0) + let exact_result = @divExact(12, 4); // 3 + + // Division with remainder (returns tuple) + let divmod_result = @divmod(a, b); // (3, 1) as tuple + + // Tuple unpacking syntax + let (quotient, remainder) = @divmod(a, b); // quotient=3, remainder=1 + + log("Truncating division: ", trunc_result); + log("Floor division: ", floor_result); + log("Ceiling division: ", ceil_result); + log("Exact division: ", exact_result); + log("Divmod result: ", divmod_result); + } + + function testSignedDivision() public { + let a: i32 = -7; + let b: i32 = 3; + + // Different rounding behaviors for negative numbers + let trunc_result = @divTrunc(a, b); // -2 (toward zero) + let floor_result = @divFloor(a, b); // -3 (toward -∞) + let ceil_result = @divCeil(a, b); // -2 (toward +∞) + + log("Signed truncating: ", trunc_result); + log("Signed floor: ", floor_result); + log("Signed ceiling: ", ceil_result); + } + + function testCompileTimeEvaluation() public { + // These should be evaluated at compile time + comptime { + let compile_div = @divTrunc(20, 4); // 5 + let compile_mod = @divmod(13, 4); // quotient=3, remainder=1 + + // These values are computed at compile time + assert(compile_div == 5); + } + } + + function testTryCatchDivision() public { + let a: u32 = 10; + let b: u32 = 0; // Will cause division by zero + + // Try-catch with division by zero + try { + let result = @divTrunc(a, b); + log("Division succeeded: ", result); + } catch(err) { + log("Division failed with error: ", err); + } + + // Try-catch with exact division + try { + let exact_result = @divExact(10, 3); // Will fail - not exact + log("Exact division succeeded: ", exact_result); + } catch(err) { + log("Exact division failed with error: ", err); + } + + // Safe division with error handling + let safe_result = safeDivide(a, 3); + log("Safe division result: ", safe_result); + } + + function safeDivide(a: u32, b: u32) -> !u32 { + if (b == 0) { + return error.DivisionByZero; + } + + return @divTrunc(a, b); + } +} \ No newline at end of file diff --git a/examples/demos/division_unit_test.ora b/examples/demos/division_unit_test.ora new file mode 100644 index 0000000..9586031 --- /dev/null +++ b/examples/demos/division_unit_test.ora @@ -0,0 +1,58 @@ +// Simple Unit Test for Division Functions +// Quick smoke test to verify basic division functionality + +contract DivisionUnitTest { + // Test basic division operations + function testBasicOperations() public { + log("=== Basic Division Unit Test ==="); + + // Test @divTrunc + let trunc_result = @divTrunc(10, 3); + assert(trunc_result == 3, "divTrunc(10, 3) should be 3"); + log("✓ @divTrunc test passed"); + + // Test @divFloor + let floor_result = @divFloor(-10, 3); + assert(floor_result == -4, "divFloor(-10, 3) should be -4"); + log("✓ @divFloor test passed"); + + // Test @divCeil + let ceil_result = @divCeil(10, 3); + assert(ceil_result == 4, "divCeil(10, 3) should be 4"); + log("✓ @divCeil test passed"); + + // Test @divExact + let exact_result = @divExact(20, 5); + assert(exact_result == 4, "divExact(20, 5) should be 4"); + log("✓ @divExact test passed"); + + // Test @divmod with tuple unpacking + let (quotient, remainder) = @divmod(10, 3); + assert(quotient == 3, "divmod(10, 3) quotient should be 3"); + assert(remainder == 1, "divmod(10, 3) remainder should be 1"); + log("✓ @divmod tuple unpacking test passed"); + + log("=== All unit tests passed! ==="); + } + + // Test compile-time evaluation + function testComptimeBasic() public { + comptime { + let ct_result = @divTrunc(100, 10); // Should be 10 + assert(ct_result == 10, "Comptime divTrunc should work"); + + let (ct_q, ct_r) = @divmod(17, 5); // Should be (3, 2) + assert(ct_q == 3 && ct_r == 2, "Comptime divmod should work"); + } + + log("✓ Compile-time evaluation test passed"); + } + + // Helper assert function + function assert(condition: bool, message: string) { + if (!condition) { + log("❌ ASSERTION FAILED: ", message); + // In a real implementation, this would revert or throw + } + } +} \ No newline at end of file diff --git a/examples/error_union_demo.zig b/examples/demos/error_union_demo.zig similarity index 100% rename from examples/error_union_demo.zig rename to examples/demos/error_union_demo.zig diff --git a/examples/formal_test.zig b/examples/demos/formal_test.zig similarity index 100% rename from examples/formal_test.zig rename to examples/demos/formal_test.zig diff --git a/examples/formal_verification_demo.zig b/examples/demos/formal_verification_demo.zig similarity index 100% rename from examples/formal_verification_demo.zig rename to examples/demos/formal_verification_demo.zig diff --git a/examples/optimization_demo.zig b/examples/demos/optimization_demo.zig similarity index 100% rename from examples/optimization_demo.zig rename to examples/demos/optimization_demo.zig diff --git a/examples/parser_demo.zig b/examples/demos/parser_demo.zig similarity index 99% rename from examples/parser_demo.zig rename to examples/demos/parser_demo.zig index 2bcec45..3377f73 100644 --- a/examples/parser_demo.zig +++ b/examples/demos/parser_demo.zig @@ -277,7 +277,7 @@ fn printTypeRef(type_ref: ast.TypeRef) void { std.debug.print("]", .{}); }, .Mapping => |mapping| { - std.debug.print("mapping[", .{}); + std.debug.print("map[", .{}); printTypeRef(mapping.key.*); std.debug.print(", ", .{}); printTypeRef(mapping.value.*); diff --git a/examples/verification_demo.zig b/examples/demos/verification_demo.zig similarity index 100% rename from examples/verification_demo.zig rename to examples/demos/verification_demo.zig diff --git a/examples/yul_test.zig b/examples/demos/yul_test.zig similarity index 100% rename from examples/yul_test.zig rename to examples/demos/yul_test.zig diff --git a/examples/grammar/grammar_test.ora b/examples/grammar/grammar_test.ora new file mode 100644 index 0000000..33cfa2c --- /dev/null +++ b/examples/grammar/grammar_test.ora @@ -0,0 +1,393 @@ +// Ora Grammar Test File +// This file tests all major language constructs defined in the grammar + +// ========================================== +// IMPORT DECLARATIONS +// ========================================== + +@import("std/crypto") +@import("std/utils") + +// ========================================== +// CONTRACT DECLARATIONS +// ========================================== + +contract GrammarTest { + // ========================================== + // VARIABLE DECLARATIONS (different memory regions) + // ========================================== + + // Storage variables (persistent) + storage var total_supply: u256; + storage let contract_name: string; + storage const MAX_SUPPLY: u256 = 1000000; + storage var balances: map[address, u256]; + storage var allowances: doublemap[address, address, u256]; + + // Immutable variables (set once) + immutable owner: address; + immutable decimals: u8; + + // Memory variables (temporary) + memory var temp_buffer: bytes; + + // Tstore variables (transient storage) + tstore var temp_state: u256; + + // ========================================== + // LOG DECLARATIONS (EVENTS) + // ========================================== + + log Transfer(from: address, to: address, amount: u256); + log Approval(owner: address, spender: address, amount: u256); + log StateChanged(old_state: u256, new_state: u256); + log ErrorOccurred(error_code: u256, message: string); + + // ========================================== + // STRUCT DECLARATIONS + // ========================================== + + struct User { + balance: u256; + last_activity: u256; + is_active: bool; + } + + struct Transaction { + from: address; + to: address; + amount: u256; + timestamp: u256; + } + + // ========================================== + // ENUM DECLARATIONS + // ========================================== + + enum TokenState { + Inactive, + Active, + Paused, + Frozen = 100 + } + + enum ErrorCode { + None, + InsufficientBalance, + InvalidAddress, + Unauthorized + } + + // ========================================== + // FUNCTION DECLARATIONS + // ========================================== + + // Constructor function + pub fn init(initial_supply: u256, token_name: string, token_decimals: u8) { + total_supply = initial_supply; + contract_name = token_name; + decimals = token_decimals; + owner = msg.sender; + balances[owner] = initial_supply; + log Transfer(0x0, owner, initial_supply); + } + + // Simple getter function + pub fn get_balance(account: address) -> u256 { + return balances[account]; + } + + // Function with preconditions and postconditions + pub fn transfer(to: address, amount: u256) -> bool + requires(balances[msg.sender] >= amount) + requires(to != 0x0) + requires(amount > 0) + ensures(balances[msg.sender] + balances[to] == old(balances[msg.sender]) + old(balances[to])) + ensures(result == true) + { + let sender_balance = balances[msg.sender]; + let receiver_balance = balances[to]; + + balances[msg.sender] = sender_balance - amount; + balances[to] = receiver_balance + amount; + + log Transfer(msg.sender, to, amount); + return true; + } + + // Function with compound assignments + pub fn compound_operations(value: u256) { + total_supply += value; + total_supply -= value / 2; + total_supply *= 2; + } + + // Function with control flow + pub fn conditional_logic(condition: bool, value: u256) -> u256 { + if (condition) { + if (value > 100) { + return value * 2; + } else { + return value; + } + } else { + return 0; + } + } + + // Function with loops + pub fn loop_example(iterations: u256) -> u256 { + let counter: u256 = 0; + let result: u256 = 0; + + while (counter < iterations) { + result += counter; + counter += 1; + + if (counter > 1000) { + break; + } + } + + return result; + } + + // Function with error handling + pub fn safe_divide(a: u256, b: u256) -> u256 | ErrorCode { + if (b == 0) { + return ErrorCode.InvalidAddress; + } + return a / b; + } + + // Function with try-catch + pub fn try_operation(value: u256) -> bool { + try safe_divide(value, 2) catch error { + log ErrorOccurred(1, "Division failed"); + return false; + } + return true; + } + + // Function with transfer statement + pub fn transfer_tokens(from: address, to: address, amount: u256) { + balances from from -> to : amount; + log Transfer(from, to, amount); + } + + // Function with lock/unlock + pub fn synchronized_operation(target: address) { + @lock(balances[target]); + let old_balance = balances[target]; + balances[target] = old_balance + 100; + @unlock(balances[target]); + } + + // Function with compile-time evaluation + pub fn comptime_calculation() -> u256 { + const result = comptime MAX_SUPPLY * 2; + return result; + } + + // Function with type casting + pub fn type_conversion(value: u128) -> u256 { + return value as u256; + } + + // Function with old() expressions + pub fn balance_preservation(account: address, amount: u256) + ensures(balances[account] >= old(balances[account])) + { + balances[account] += amount; + } + + // ========================================== + // COMPLEX EXPRESSIONS + // ========================================== + + pub fn expression_showcase() -> u256 { + // Arithmetic expressions + let arithmetic = (10 + 5) * 3 / 2 - 1; + + // Logical expressions + let logical = (true && false) || (!true && false); + + // Comparison expressions + let comparison = (arithmetic > 5) && (arithmetic <= 100); + + // Bitwise expressions (if supported) + let bitwise = 0xFF & 0x0F; + + // Function calls with multiple arguments + let function_result = safe_divide(arithmetic, 2); + + // Array/mapping access + let balance = balances[msg.sender]; + let allowance = allowances[msg.sender, owner]; + + // Field access + let sender = msg.sender; + let block_number = block.number; + + // Complex nested expression + return (arithmetic + bitwise) * (comparison ? 1 : 0) + balance; + } + + // ========================================== + // STATEMENT TYPES + // ========================================== + + pub fn statement_showcase() { + // Variable declarations + let local_var: u256 = 100; + var mutable_var: u256 = 200; + + // Assignments + mutable_var = local_var + 50; + + // Compound assignments + mutable_var += 10; + mutable_var -= 5; + mutable_var *= 2; + + // Expression statements + get_balance(msg.sender); + + // Control flow + if (mutable_var > 100) { + log StateChanged(0, mutable_var); + } + + // Loops with control statements + let i: u256 = 0; + while (i < 10) { + if (i == 5) { + continue; + } + if (i == 8) { + break; + } + i += 1; + } + + // Return statements + if (mutable_var > 500) { + return; + } + + // Log statements + log StateChanged(local_var, mutable_var); + } + + // ========================================== + // ADVANCED TYPE USAGE + // ========================================== + + pub fn type_showcase() { + // Primitive types + let small_number: u8 = 255; + let large_number: u256 = 1000000; + let signed_number: i128 = -42; + let flag: bool = true; + let addr: address = 0x1234567890123456789012345678901234567890; + let text: string = "Hello, Ora!"; + let data: bytes = 0x1234abcd; + + // Array types + let numbers: [u256; 10]; + let dynamic_array: [u8]; + + // Mapping types + let simple_mapping: map[address, u256]; + let double_mapping: doublemap[address, address, u256]; + + // Optional types + let maybe_value: ?u256; + + // Error union types + let result: u256 | ErrorCode; + + // Custom types + let user: User; + let state: TokenState; + } +} + +// ========================================== +// STANDALONE FUNCTION (MODULE-LEVEL) +// ========================================== + +pub fn utility_function(a: u256, b: u256) -> u256 { + return a + b; +} + +// ========================================== +// ADDITIONAL CONTRACTS FOR TESTING +// ========================================== + +contract SimpleContract { + var value: u256; + + pub fn init() { + value = 0; + } + + pub fn increment() { + value += 1; + } +} + +contract InterfaceContract { + pub fn external_function() -> bool; +} + +// ========================================== +// EDGE CASES AND CORNER CASES +// ========================================== + +contract EdgeCases { + // Empty contract member lists + + // Functions with no parameters + pub fn no_params() { + // Empty function body + } + + // Functions with no return type + pub fn no_return(x: u256) { + let _ = x; + } + + // Functions with complex parameter lists + pub fn complex_params( + a: u256, + b: map[address, u256], + c: ?bool, + d: u256 | ErrorCode + ) -> bool { + return true; + } + + // Nested blocks + pub fn nested_blocks() { + { + let x: u256 = 1; + { + let y: u256 = 2; + { + let z: u256 = x + y; + } + } + } + } + + // Multiple requires/ensures clauses + pub fn multiple_clauses(x: u256) -> u256 + requires(x > 0) + requires(x < 1000) + ensures(result >= x) + ensures(result <= x * 2) + { + return x * 2; + } +} \ No newline at end of file diff --git a/examples/grammar/simple_grammar_test.ora b/examples/grammar/simple_grammar_test.ora new file mode 100644 index 0000000..a7ad646 --- /dev/null +++ b/examples/grammar/simple_grammar_test.ora @@ -0,0 +1,24 @@ +// Simple Grammar Test +// Testing basic language features + +contract SimpleTest { + storage var balance: u256; + immutable owner: address; + + log Transfer(from: address, to: address, amount: u256); + + pub fn init(initial_balance: u256) { + balance = initial_balance; + owner = msg.sender; + } + + pub fn get_balance() -> u256 { + return balance; + } + + pub fn transfer(to: address, amount: u256) -> bool { + balance -= amount; + log Transfer(msg.sender, to, amount); + return true; + } +} \ No newline at end of file diff --git a/examples/grammar/updated_grammar_test.ora b/examples/grammar/updated_grammar_test.ora new file mode 100644 index 0000000..9d68def --- /dev/null +++ b/examples/grammar/updated_grammar_test.ora @@ -0,0 +1,46 @@ +// Updated Grammar Test - Testing our improvements +contract UpdatedTest { + // Testing new 'map' syntax instead of 'mapping' + storage var balances: map[address, u256]; + storage var allowances: doublemap[address, address, u256]; + + // Testing new 'bytes' type + storage var contract_code: bytes; + storage var signature_data: bytes; + + // Testing arrays (no vectors for smart contracts) + storage var fixed_array: [u256; 10]; // Fixed-size array + storage var dynamic_array: [u8]; // Dynamic array + + log Transfer(from: address, to: address, amount: u256); + log DataStored(data: bytes); + + pub fn init() { + balances[msg.sender] = 1000; + contract_code = 0x608060405234801561001057600080fd5b50; + signature_data = 0x1234abcd; + } + + pub fn store_data(data: bytes) { + contract_code = data; + log DataStored(data); + } + + pub fn get_balance(account: address) -> u256 { + return balances[account]; + } + + pub fn process_bytes(input: bytes) -> bytes { + return input; + } + + pub fn array_operations() { + // Fixed array operations + fixed_array[0] = 100; + fixed_array[1] = 200; + + // Dynamic array operations (with care for gas) + // Note: These would need proper gas management in real contracts + let temp_array: [u8] = dynamic_array; + } +} \ No newline at end of file diff --git a/examples/signed_integers/arithmetic_signed_test.ora b/examples/signed_integers/arithmetic_signed_test.ora new file mode 100644 index 0000000..84ae73d --- /dev/null +++ b/examples/signed_integers/arithmetic_signed_test.ora @@ -0,0 +1,13 @@ +contract ArithmeticSignedTest { + storage const a: i32 = -10; + storage const b: i32 = -5; + storage const c: i32 = 15; + + pub fn init() { + // Test arithmetic operations + var sum: i32 = a + b; // -10 + (-5) = -15 + var diff: i32 = a - b; // -10 - (-5) = -5 + var product: i32 = a * b; // -10 * (-5) = 50 + var quotient: i32 = c / b; // 15 / (-5) = -3 + } +} \ No newline at end of file diff --git a/examples/signed_integers/debug_signed_test.ora b/examples/signed_integers/debug_signed_test.ora new file mode 100644 index 0000000..df1cf40 --- /dev/null +++ b/examples/signed_integers/debug_signed_test.ora @@ -0,0 +1,14 @@ +contract DebugTest { + // Test with explicit u32 to i32 assignment + storage const test1: i32 = 42; + + // Test with negative literal + storage const test2: i32 = -42; + + // Test with unsigned variable + storage const test3: u32 = 42; + + pub fn init() { + // Empty init function + } +} \ No newline at end of file diff --git a/examples/signed_integers/minimal_signed_test.ora b/examples/signed_integers/minimal_signed_test.ora new file mode 100644 index 0000000..dd55836 --- /dev/null +++ b/examples/signed_integers/minimal_signed_test.ora @@ -0,0 +1,6 @@ +contract MinimalSignedTest { + storage const value: u32 = 1; + + pub fn init() { + } +} \ No newline at end of file diff --git a/examples/signed_integers/signed_int_test.ora b/examples/signed_integers/signed_int_test.ora new file mode 100644 index 0000000..dfbecb0 --- /dev/null +++ b/examples/signed_integers/signed_int_test.ora @@ -0,0 +1,43 @@ +contract SignedIntTest { + // Test signed integer declarations + let i8_val: i8 = -128; + let i16_val: i16 = -32768; + let i32_val: i32 = -2147483648; + let i64_val: i64 = -9223372036854775808; + let i128_val: i128 = -170141183460469231731687303715884105728; + + // Test arithmetic operations + let sum: i32 = 10 + (-5); // Should be 5 + let diff: i32 = 10 - 15; // Should be -5 + let prod: i32 = 3 * (-4); // Should be -12 + let quot: i32 = -15 / 3; // Should be -5 + let mod: i32 = -17 % 5; // Should be -2 + + // Test comparisons + let less: bool = -5 < 5; // Should be true + let greater: bool = 10 > -10; // Should be true + let equal: bool = -5 == -5; // Should be true + + // Test negative literals + let neg_literal: i8 = -42; + + pub fn init() { + // Initialize the contract + } + + pub fn testSignedArithmetic() { + // Test that arithmetic works correctly + let a: i32 = 10; + let b: i32 = -5; + let result: i32 = a + b; // Should be 5 + requires(result == 5); + } + + pub fn testSignedComparisons() { + let a: i32 = -10; + let b: i32 = 5; + requires(a < b); + requires(b > a); + requires(a == -10); + } +} \ No newline at end of file diff --git a/examples/signed_integers/simple_signed_test.ora b/examples/signed_integers/simple_signed_test.ora new file mode 100644 index 0000000..f6e1012 --- /dev/null +++ b/examples/signed_integers/simple_signed_test.ora @@ -0,0 +1,6 @@ +contract SimpleSignedTest { + storage const value: i32 = -42; + + pub fn init() { + } +} \ No newline at end of file diff --git a/examples/signed_integers/test_signed_integers.ora b/examples/signed_integers/test_signed_integers.ora new file mode 100644 index 0000000..4445e25 --- /dev/null +++ b/examples/signed_integers/test_signed_integers.ora @@ -0,0 +1,23 @@ +contract TestSignedIntegers { + // Test signed integer declarations + storage const i8_val: i8 = -128; + storage const i16_val: i16 = -32768; + storage const i32_val: i32 = -2147483648; + storage const i64_val: i64 = -9223372036854775808; + storage const i128_val: i128 = -170141183460469231731687303715884105728; + + // Test arithmetic operations + storage const sum: i32 = 10 + (-5); // Should be 5 + storage const diff: i32 = 10 - 15; // Should be -5 + storage const prod: i32 = 3 * (-4); // Should be -12 + storage const quot: i32 = -15 / 3; // Should be -5 + storage const mod: i32 = -17 % 5; // Should be -2 + + // Test comparisons + storage const less: bool = -5 < 5; // Should be true + storage const greater: bool = 10 > -10; // Should be true + storage const equal: bool = -5 == -5; // Should be true + + // Test negative literals + storage const neg_literal: i8 = -42; +} \ No newline at end of file diff --git a/examples/signed_integers/working_signed_test.ora b/examples/signed_integers/working_signed_test.ora new file mode 100644 index 0000000..03c4aa9 --- /dev/null +++ b/examples/signed_integers/working_signed_test.ora @@ -0,0 +1,14 @@ +contract WorkingSignedTest { + // Test signed integer declarations with correct syntax + storage const i8_val: i8 = -128; + storage const i16_val: i16 = -32768; + storage const i32_val: i32 = -2147483648; + storage const i64_val: i64 = -9223372036854775808; + + // Test negative literals + storage const neg_literal: i8 = -42; + + pub fn init() { + // Empty init function + } +} \ No newline at end of file diff --git a/examples/simple_token.ora b/examples/tokens/simple_token.ora similarity index 95% rename from examples/simple_token.ora rename to examples/tokens/simple_token.ora index 80e67af..d05911c 100644 --- a/examples/simple_token.ora +++ b/examples/tokens/simple_token.ora @@ -5,7 +5,7 @@ contract SimpleToken { // Storage state storage var totalSupply: u256; - storage var balances: mapping[address, u256]; + storage var balances: map[address, u256]; // Events log Transfer(from: address, to: address, amount: u256); diff --git a/examples/simple_token_basic.ora b/examples/tokens/simple_token_basic.ora similarity index 89% rename from examples/simple_token_basic.ora rename to examples/tokens/simple_token_basic.ora index ec9e21a..a8a1921 100644 --- a/examples/simple_token_basic.ora +++ b/examples/tokens/simple_token_basic.ora @@ -1,7 +1,7 @@ contract SimpleToken { // Storage state storage var totalSupply: u256; - storage var balances: mapping[address, u256]; + storage var balances: map[address, u256]; // Events log Transfer(from: address, to: address, amount: u256); diff --git a/examples/test_erc20.ora b/examples/tokens/test_erc20.ora similarity index 97% rename from examples/test_erc20.ora rename to examples/tokens/test_erc20.ora index 757d80a..5760f78 100644 --- a/examples/test_erc20.ora +++ b/examples/tokens/test_erc20.ora @@ -4,7 +4,7 @@ contract ERC20 { storage const decimals: u8; storage var total_supply: u256; - storage var balances: mapping[address, u256]; + storage var balances: map[address, u256]; storage var allowances: doublemap[address, address, u256]; log Transfer(from: address, to: address, value: u256); diff --git a/scripts/generate-docs.sh b/scripts/generate-docs.sh new file mode 100755 index 0000000..6d95c62 --- /dev/null +++ b/scripts/generate-docs.sh @@ -0,0 +1,29 @@ +#!/bin/bash + +# Ora Documentation Generation Script +# This script generates Zig documentation and integrates it into the Docusaurus website + +set -e + +echo "🔨 Generating Zig documentation..." + +# Generate Zig docs +zig build docs + +echo "📁 Copying documentation to website..." + +# Create target directory if it doesn't exist +mkdir -p website/static/api-docs + +# Copy generated docs to website static folder +cp -r zig-out/docs/* website/static/api-docs/ + +echo "✅ API documentation generated and copied to website/static/api-docs/" +echo "📖 Documentation will be available at /api-docs/ when the website is built" + +# Optional: Start development server if requested +if [ "$1" = "--serve" ]; then + echo "🚀 Starting development server..." + cd website + pnpm start +fi \ No newline at end of file diff --git a/simple_storage_test.bin b/simple_storage_test.bin deleted file mode 100644 index daa920f..0000000 --- a/simple_storage_test.bin +++ /dev/null @@ -1 +0,0 @@ -602a6001900160005260206000f3 \ No newline at end of file diff --git a/simple_token.bin b/simple_token.bin deleted file mode 100644 index daa920f..0000000 --- a/simple_token.bin +++ /dev/null @@ -1 +0,0 @@ -602a6001900160005260206000f3 \ No newline at end of file diff --git a/simple_token_basic.bin b/simple_token_basic.bin deleted file mode 100644 index c92984f..0000000 --- a/simple_token_basic.bin +++ /dev/null @@ -1 +0,0 @@ -6035600d60003960356000f3fe60003560e01c806231651014602b575b631b6831d314601e575b600080fd5b60206029600435602d565bf35b005b60019020549056 \ No newline at end of file diff --git a/simple_token_basic.hir.json b/simple_token_basic.hir.json deleted file mode 100644 index 658b137..0000000 --- a/simple_token_basic.hir.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "version": "1.0", - "contracts": [ - { - "name": "SimpleToken", - "storage": [ - { - "name": "totalSupply", - "type": "u256", - "region": "storage", - "mutable": true - }, - { - "name": "balances", - "type": {"type": "mapping", "key": "address", "value": "u256"}, - "region": "storage", - "mutable": true - } - ], - "functions": [ - { - "name": "init", - "visibility": "public", - "parameters": [ - { - "name": "_supply", - "type": "u256" - } - ], - "return_type": null, - "state_effects_count": 2, - "observable_effects_count": 0 - }, - { - "name": "balanceOf", - "visibility": "public", - "parameters": [ - { - "name": "owner", - "type": "address" - } - ], - "return_type": "u256", - "state_effects_count": 0, - "observable_effects_count": 0 - } - ], - "events": [ - { - "name": "Transfer", - "fields": [ - { - "name": "from", - "type": "address", - "indexed": true - }, - { - "name": "to", - "type": "address", - "indexed": true - }, - { - "name": "amount", - "type": "u256", - "indexed": false - } - ] - } - ] - } - ] -} diff --git a/src/ast.zig b/src/ast.zig index 1e8e81f..a7de97b 100644 --- a/src/ast.zig +++ b/src/ast.zig @@ -70,17 +70,28 @@ pub const TypeRef = union(enum) { U64: void, U128: void, U256: void, + I8: void, + I16: void, + I32: void, + I64: void, + I128: void, + I256: void, String: void, + Bytes: void, // Complex types Slice: *TypeRef, Mapping: MappingType, DoubleMap: DoubleMapType, Identifier: []const u8, // For custom types (structs, enums) + Tuple: TupleType, // Tuple types // Error handling types ErrorUnion: ErrorUnionType, // !T syntax Result: ResultType, // Result[T, E] syntax + + // Special types + Unknown: void, // For type inference }; /// Error union type (!T) @@ -94,6 +105,11 @@ pub const ResultType = struct { error_type: *TypeRef, }; +/// Tuple type for multiple values +pub const TupleType = struct { + types: []TypeRef, +}; + pub const MappingType = struct { key: *TypeRef, value: *TypeRef, @@ -114,6 +130,8 @@ pub const VariableDeclNode = struct { typ: TypeRef, value: ?ExprNode, span: SourceSpan, + // Tuple unpacking support + tuple_names: ?[][]const u8, // For tuple unpacking: let (a, b) = expr }; /// Memory regions matching Ora specification @@ -180,6 +198,7 @@ pub const StmtNode = union(enum) { Break: SourceSpan, Continue: SourceSpan, Log: LogNode, + Lock: LockNode, // @lock annotations Invariant: InvariantNode, // Loop invariants Requires: RequiresNode, Ensures: EnsuresNode, @@ -248,6 +267,11 @@ pub const CatchBlock = struct { span: SourceSpan, }; +pub const LockNode = struct { + path: ExprNode, // e.g., balances[to] + span: SourceSpan, +}; + /// Expression pub const ExprNode = union(enum) { Identifier: IdentifierExpr, @@ -262,11 +286,15 @@ pub const ExprNode = union(enum) { Cast: CastExpr, Comptime: ComptimeExpr, Old: OldExpr, // old() expressions in ensures clauses + Tuple: TupleExpr, // tuple expressions (a, b, c) // Error handling expressions Try: TryExpr, // try expression ErrorReturn: ErrorReturnExpr, // error.SomeError ErrorCast: ErrorCastExpr, // value as !T + + // Shift operations + Shift: ShiftExpr, // mapping from source -> dest : amount }; pub const IdentifierExpr = struct { @@ -421,6 +449,12 @@ pub const OldExpr = struct { span: SourceSpan, }; +/// Tuple expressions (a, b, c) +pub const TupleExpr = struct { + elements: []ExprNode, + span: SourceSpan, +}; + /// Try expression pub const TryExpr = struct { expr: *ExprNode, @@ -440,6 +474,15 @@ pub const ErrorCastExpr = struct { span: SourceSpan, }; +/// Shift expression (mapping from source -> dest : amount) +pub const ShiftExpr = struct { + mapping: *ExprNode, // The mapping being modified (e.g., balances) + source: *ExprNode, // Source expression (e.g., std.transaction.sender) + dest: *ExprNode, // Destination expression (e.g., to) + amount: *ExprNode, // Amount expression (e.g., amount) + span: SourceSpan, +}; + /// Visitor pattern for AST traversal pub const AstVisitor = struct { const Self = @This(); @@ -704,6 +747,16 @@ pub fn deinitExprNode(allocator: std.mem.Allocator, expr: *ExprNode) void { allocator.destroy(error_cast.operand); deinitTypeRef(allocator, &error_cast.target_type); }, + .Shift => |*shift| { + deinitExprNode(allocator, shift.mapping); + deinitExprNode(allocator, shift.source); + deinitExprNode(allocator, shift.dest); + deinitExprNode(allocator, shift.amount); + allocator.destroy(shift.mapping); + allocator.destroy(shift.source); + allocator.destroy(shift.dest); + allocator.destroy(shift.amount); + }, else => { // Literals and identifiers don't need cleanup }, @@ -748,6 +801,9 @@ pub fn deinitStmtNode(allocator: std.mem.Allocator, stmt: *StmtNode) void { } allocator.free(log.args); }, + .Lock => |*lock| { + deinitExprNode(allocator, &lock.path); + }, .Invariant => |*inv| { deinitExprNode(allocator, &inv.condition); }, @@ -960,7 +1016,14 @@ pub const ASTSerializer = struct { .U64 => try writer.writeAll("\"u64\""), .U128 => try writer.writeAll("\"u128\""), .U256 => try writer.writeAll("\"u256\""), + .I8 => try writer.writeAll("\"i8\""), + .I16 => try writer.writeAll("\"i16\""), + .I32 => try writer.writeAll("\"i32\""), + .I64 => try writer.writeAll("\"i64\""), + .I128 => try writer.writeAll("\"i128\""), + .I256 => try writer.writeAll("\"i256\""), .String => try writer.writeAll("\"string\""), + .Bytes => try writer.writeAll("\"bytes\""), .Slice => |slice_element_type| { try writer.writeAll("{\"type\": \"slice\", \"element\": "); try serializeTypeRef(slice_element_type, writer); @@ -1147,6 +1210,14 @@ pub const ASTSerializer = struct { try writeIndent(writer, indent + 1); try writer.writeAll("],\n"); }, + .Lock => |*lock| { + try writeIndent(writer, indent + 1); + try writer.writeAll("\"type\": \"Lock\",\n"); + try writeIndent(writer, indent + 1); + try writer.writeAll("\"path\": "); + try serializeExprNode(&lock.path, writer, indent + 2); + try writer.writeAll("\n"); + }, .Invariant => |*inv| { try writeIndent(writer, indent + 1); try writer.writeAll("\"type\": \"Invariant\",\n"); @@ -1391,6 +1462,30 @@ pub const ASTSerializer = struct { try serializeSourceSpan(error_cast.span, writer); try writer.writeAll("\n"); }, + .Shift => |*shift| { + try writeIndent(writer, indent + 1); + try writer.writeAll("\"type\": \"Shift\",\n"); + try writeIndent(writer, indent + 1); + try writer.writeAll("\"mapping\": "); + try serializeExprNode(shift.mapping, writer, indent + 2); + try writer.writeAll(",\n"); + try writeIndent(writer, indent + 1); + try writer.writeAll("\"source\": "); + try serializeExprNode(shift.source, writer, indent + 2); + try writer.writeAll(",\n"); + try writeIndent(writer, indent + 1); + try writer.writeAll("\"dest\": "); + try serializeExprNode(shift.dest, writer, indent + 2); + try writer.writeAll(",\n"); + try writeIndent(writer, indent + 1); + try writer.writeAll("\"amount\": "); + try serializeExprNode(shift.amount, writer, indent + 2); + try writer.writeAll(",\n"); + try writeIndent(writer, indent + 1); + try writer.writeAll("\"span\": "); + try serializeSourceSpan(shift.span, writer); + try writer.writeAll("\n"); + }, .Identifier => |*ident| { try writeIndent(writer, indent + 1); try writer.writeAll("\"type\": \"Identifier\",\n"); diff --git a/src/codegen_yul.zig b/src/codegen_yul.zig index 51d9650..4217612 100644 --- a/src/codegen_yul.zig +++ b/src/codegen_yul.zig @@ -51,6 +51,8 @@ pub const YulCodegen = struct { storage_counter: u32, /// Mapping from storage variable names to their slot numbers storage_slots: std.HashMap([]const u8, u32, std.hash_map.StringContext, std.hash_map.default_max_load_percentage), + /// Mapping from immutable variable names to their identifiers + immutable_vars: std.HashMap([]const u8, []const u8, std.hash_map.StringContext, std.hash_map.default_max_load_percentage), /// Current contract context for event lookup current_contract: ?*const Contract, @@ -71,6 +73,7 @@ pub const YulCodegen = struct { .current_function = null, .storage_counter = 0, .storage_slots = std.HashMap([]const u8, u32, std.hash_map.StringContext, std.hash_map.default_max_load_percentage).init(allocator), + .immutable_vars = std.HashMap([]const u8, []const u8, std.hash_map.StringContext, std.hash_map.default_max_load_percentage).init(allocator), .current_contract = null, }; } @@ -85,6 +88,13 @@ pub const YulCodegen = struct { } self.variable_stack.deinit(); self.storage_slots.deinit(); + + // Free immutable variable identifiers + var iter = self.immutable_vars.iterator(); + while (iter.next()) |entry| { + self.allocator.free(entry.value_ptr.*); + } + self.immutable_vars.deinit(); } /// Push a variable name onto the stack (takes ownership) @@ -185,11 +195,18 @@ pub const YulCodegen = struct { // Store current contract for event lookup self.current_contract = contract; - // Initialize storage slot mapping + // Initialize storage slot mapping and immutable variable tracking var slot_counter: u32 = 0; for (contract.storage) |*storage_var| { - try self.storage_slots.put(storage_var.name, slot_counter); - slot_counter += 1; + if (storage_var.region == .immutable) { + // Track immutable variables with unique identifiers + const immutable_id = try std.fmt.allocPrint(self.allocator, "immutable_{s}", .{storage_var.name}); + try self.immutable_vars.put(storage_var.name, immutable_id); + } else { + // Regular storage variables get slot numbers + try self.storage_slots.put(storage_var.name, slot_counter); + slot_counter += 1; + } } try yul_code.writer().print(" // Contract: {s}\n", .{contract.name}); @@ -225,17 +242,26 @@ pub const YulCodegen = struct { /// yul_code: Output buffer /// contract: Contract with storage variables fn generateConstructor(self: *Self, yul_code: *std.ArrayList(u8), contract: *const Contract) YulCodegenError!void { - try yul_code.appendSlice(" // Constructor - initialize storage\n"); + try yul_code.appendSlice(" // Constructor - initialize storage and immutable variables\n"); for (contract.storage) |*storage_var| { if (storage_var.value) |value| { - const slot = self.storage_counter; - self.storage_counter += 1; - - try yul_code.writer().print(" // Initialize {s}\n", .{storage_var.name}); const value_code = try self.generateExpression(yul_code, value); defer self.allocator.free(value_code); - try yul_code.writer().print(" sstore({}, {s})\n", .{ slot, value_code }); + + if (storage_var.region == .immutable) { + // Use setimmutable for immutable variables + if (self.immutable_vars.get(storage_var.name)) |immutable_id| { + try yul_code.writer().print(" // Initialize immutable {s}\n", .{storage_var.name}); + try yul_code.writer().print(" setimmutable(\"{s}\", {s})\n", .{ immutable_id, value_code }); + } + } else { + // Use sstore for regular storage variables + const slot = self.storage_counter; + self.storage_counter += 1; + try yul_code.writer().print(" // Initialize storage {s}\n", .{storage_var.name}); + try yul_code.writer().print(" sstore({}, {s})\n", .{ slot, value_code }); + } } } } @@ -343,9 +369,11 @@ pub const YulCodegen = struct { return switch (ora_type) { .primitive => |prim| switch (prim) { .u8, .u16, .u32, .u64, .u128, .u256 => "uint256", + .i8, .i16, .i32, .i64, .i128, .i256 => "int256", .bool => "bool", .address => "address", .string => "string", + .bytes => "bytes", }, .slice => |_| "uint256[]", // Simplified - slices become uint256[] .mapping => |_| "mapping", // Mappings don't appear in function signatures @@ -467,15 +495,29 @@ pub const YulCodegen = struct { /// Generate assignment statement fn generateAssignment(self: *Self, yul_code: *std.ArrayList(u8), assignment: *const ir.Assignment) YulCodegenError!void { - try yul_code.appendSlice(" // Assignment\n"); - const value_var = try self.generateExpression(yul_code, assignment.value); defer self.allocator.free(value_var); - // For simplicity, assume target is an identifier + // Handle different assignment targets if (assignment.target.* == .identifier) { const target_name = assignment.target.identifier.name; - try yul_code.writer().print(" {s} := {s}\n", .{ target_name, value_var }); + + // Check if this is an immutable variable + if (self.immutable_vars.get(target_name)) |immutable_id| { + try yul_code.writer().print(" // Assign to immutable {s}\n", .{target_name}); + try yul_code.writer().print(" setimmutable(\"{s}\", {s})\n", .{ immutable_id, value_var }); + } else if (self.storage_slots.get(target_name)) |slot| { + // Storage variable assignment + try yul_code.writer().print(" // Assign to storage {s}\n", .{target_name}); + try yul_code.writer().print(" sstore({}, {s})\n", .{ slot, value_var }); + } else { + // Regular variable assignment + try yul_code.writer().print(" // Assign to {s}\n", .{target_name}); + try yul_code.writer().print(" {s} := {s}\n", .{ target_name, value_var }); + } + } else { + // TODO: Handle complex assignment targets (index, field access, etc.) + try yul_code.writer().print(" // Complex assignment (TODO)\n", .{}); } } @@ -600,10 +642,22 @@ pub const YulCodegen = struct { return try self.generateLiteral(yul_code, literal); }, .identifier => |*ident| { + // Check if this is an immutable variable + if (self.immutable_vars.get(ident.name)) |immutable_id| { + const result_var = try std.fmt.allocPrint(self.allocator, "temp_{}", .{self.var_counter}); + self.var_counter += 1; + try yul_code.writer().print(" let {s} := loadimmutable(\"{s}\")\n", .{ result_var, immutable_id }); + return result_var; + } + // Check if this is a storage variable if (self.storage_slots.get(ident.name)) |slot| { - return try std.fmt.allocPrint(self.allocator, "{}", .{slot}); + const result_var = try std.fmt.allocPrint(self.allocator, "temp_{}", .{self.var_counter}); + self.var_counter += 1; + try yul_code.writer().print(" let {s} := sload({})\n", .{ result_var, slot }); + return result_var; } + // Regular identifier (parameter, local variable, etc.) return try self.allocator.dupe(u8, ident.name); }, @@ -625,6 +679,9 @@ pub const YulCodegen = struct { .transfer => |*transfer| { return try self.generateTransferExpression(yul_code, transfer); }, + .shift => |*shift| { + return try self.generateShiftExpression(yul_code, shift); + }, .old => |*old| { // Old expressions are used in formal verification - for now just evaluate the inner expression return try self.generateExpression(yul_code, old.expression); @@ -736,6 +793,16 @@ pub const YulCodegen = struct { } } } + + // Check if this is a builtin division function + if (std.mem.eql(u8, func_name, "@divTrunc") or + std.mem.eql(u8, func_name, "@divFloor") or + std.mem.eql(u8, func_name, "@divCeil") or + std.mem.eql(u8, func_name, "@divExact") or + std.mem.eql(u8, func_name, "@divmod")) + { + return try self.generateBuiltinDivision(yul_code, func_name, call.arguments); + } } // Generate arguments @@ -770,6 +837,106 @@ pub const YulCodegen = struct { return result_var; } + /// Generate builtin division functions with safety checks + fn generateBuiltinDivision(self: *Self, yul_code: *std.ArrayList(u8), function_name: []const u8, arguments: []const ir.Expression) YulCodegenError![]const u8 { + // All division functions require exactly 2 arguments + if (arguments.len != 2) { + return YulCodegenError.InvalidIR; + } + + // Generate argument variables + const lhs_var = try self.generateExpression(yul_code, &arguments[0]); + defer self.allocator.free(lhs_var); + const rhs_var = try self.generateExpression(yul_code, &arguments[1]); + defer self.allocator.free(rhs_var); + + const result_var = try std.fmt.allocPrint(self.allocator, "temp_{}", .{self.var_counter}); + self.var_counter += 1; + + // Add division by zero check for all division functions + try yul_code.writer().print(" // {s} with safety checks\n", .{function_name}); + try yul_code.writer().print(" if iszero({s}) {{\n", .{rhs_var}); + try yul_code.writer().print(" // Create error union for division by zero\n"); + try yul_code.writer().print(" mstore(0, 0x01) // error tag\n"); + try yul_code.writer().print(" mstore(0x20, 0x01) // DivisionByZero error code\n"); + try yul_code.writer().print(" revert(0, 0x40) // Return error union\n"); + try yul_code.writer().print(" }}\n"); + + if (std.mem.eql(u8, function_name, "@divTrunc")) { + // Truncating division (toward zero) - this is EVM's default division + try yul_code.writer().print(" let {s} := sdiv({s}, {s})\n", .{ result_var, lhs_var, rhs_var }); + } else if (std.mem.eql(u8, function_name, "@divFloor")) { + // Floor division (toward negative infinity) + // For positive numbers, same as truncating division + // For negative numbers, if there's a remainder, subtract 1 from result + const temp_quotient = try std.fmt.allocPrint(self.allocator, "temp_quotient_{}", .{self.var_counter}); + defer self.allocator.free(temp_quotient); + self.var_counter += 1; + + const temp_remainder = try std.fmt.allocPrint(self.allocator, "temp_remainder_{}", .{self.var_counter}); + defer self.allocator.free(temp_remainder); + self.var_counter += 1; + + try yul_code.writer().print(" let {s} := sdiv({s}, {s})\n", .{ temp_quotient, lhs_var, rhs_var }); + try yul_code.writer().print(" let {s} := smod({s}, {s})\n", .{ temp_remainder, lhs_var, rhs_var }); + try yul_code.writer().print(" let {s} := {s}\n", .{ result_var, temp_quotient }); + try yul_code.writer().print(" // Adjust for floor division\n"); + try yul_code.writer().print(" if and(not(iszero({s})), xor(slt({s}, 0), slt({s}, 0))) {{\n", .{ temp_remainder, lhs_var, rhs_var }); + try yul_code.writer().print(" {s} := sub({s}, 1)\n", .{ result_var, result_var }); + try yul_code.writer().print(" }}\n"); + } else if (std.mem.eql(u8, function_name, "@divCeil")) { + // Ceiling division (toward positive infinity) + // For positive numbers, if there's a remainder, add 1 to result + const temp_quotient = try std.fmt.allocPrint(self.allocator, "temp_quotient_{}", .{self.var_counter}); + defer self.allocator.free(temp_quotient); + self.var_counter += 1; + + const temp_remainder = try std.fmt.allocPrint(self.allocator, "temp_remainder_{}", .{self.var_counter}); + defer self.allocator.free(temp_remainder); + self.var_counter += 1; + + try yul_code.writer().print(" let {s} := sdiv({s}, {s})\n", .{ temp_quotient, lhs_var, rhs_var }); + try yul_code.writer().print(" let {s} := smod({s}, {s})\n", .{ temp_remainder, lhs_var, rhs_var }); + try yul_code.writer().print(" let {s} := {s}\n", .{ result_var, temp_quotient }); + try yul_code.writer().print(" // Adjust for ceiling division\n"); + try yul_code.writer().print(" if and(not(iszero({s})), not(xor(slt({s}, 0), slt({s}, 0)))) {{\n", .{ temp_remainder, lhs_var, rhs_var }); + try yul_code.writer().print(" {s} := add({s}, 1)\n", .{ result_var, result_var }); + try yul_code.writer().print(" }}\n"); + } else if (std.mem.eql(u8, function_name, "@divExact")) { + // Exact division - return error if remainder is not zero + const temp_remainder = try std.fmt.allocPrint(self.allocator, "temp_remainder_{}", .{self.var_counter}); + defer self.allocator.free(temp_remainder); + self.var_counter += 1; + + try yul_code.writer().print(" let {s} := smod({s}, {s})\n", .{ temp_remainder, lhs_var, rhs_var }); + try yul_code.writer().print(" if not(iszero({s})) {{\n", .{temp_remainder}); + try yul_code.writer().print(" // Create error union for inexact division\n"); + try yul_code.writer().print(" mstore(0, 0x01) // error tag\n"); + try yul_code.writer().print(" mstore(0x20, 0x02) // InexactDivision error code\n"); + try yul_code.writer().print(" revert(0, 0x40) // Return error union\n"); + try yul_code.writer().print(" }}\n"); + try yul_code.writer().print(" let {s} := sdiv({s}, {s})\n", .{ result_var, lhs_var, rhs_var }); + } else if (std.mem.eql(u8, function_name, "@divmod")) { + // Division with remainder - returns both quotient and remainder + // For now, we'll pack them into a single value (high 128 bits = quotient, low 128 bits = remainder) + // In a full implementation, this would return a tuple + const temp_quotient = try std.fmt.allocPrint(self.allocator, "temp_quotient_{}", .{self.var_counter}); + defer self.allocator.free(temp_quotient); + self.var_counter += 1; + + const temp_remainder = try std.fmt.allocPrint(self.allocator, "temp_remainder_{}", .{self.var_counter}); + defer self.allocator.free(temp_remainder); + self.var_counter += 1; + + try yul_code.writer().print(" let {s} := sdiv({s}, {s})\n", .{ temp_quotient, lhs_var, rhs_var }); + try yul_code.writer().print(" let {s} := smod({s}, {s})\n", .{ temp_remainder, lhs_var, rhs_var }); + try yul_code.writer().print(" // Pack quotient and remainder into single value\n"); + try yul_code.writer().print(" let {s} := or(shl(128, {s}), and({s}, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF))\n", .{ result_var, temp_quotient, temp_remainder }); + } + + return result_var; + } + /// Generate event logging fn generateEventLog(self: *Self, yul_code: *std.ArrayList(u8), event: *const ir.Event, arguments: []const ir.Expression) YulCodegenError![]const u8 { // Generate argument variables @@ -974,6 +1141,81 @@ pub const YulCodegen = struct { return result_var; } + /// Generate shift expression (mapping balance transfer with safety checks) + fn generateShiftExpression(self: *Self, yul_code: *std.ArrayList(u8), shift: *const ir.ShiftExpression) YulCodegenError![]const u8 { + const mapping_var = try self.generateExpression(yul_code, shift.mapping); + const source_var = try self.generateExpression(yul_code, shift.source); + const dest_var = try self.generateExpression(yul_code, shift.dest); + const amount_var = try self.generateExpression(yul_code, shift.amount); + defer self.allocator.free(mapping_var); + defer self.allocator.free(source_var); + defer self.allocator.free(dest_var); + defer self.allocator.free(amount_var); + + // Check if mapping is a storage variable (mapping_var should be a slot number) + if (std.fmt.parseInt(u32, mapping_var, 10)) |slot| { + // Generate safe balance transfer with checks + + // 1. Get sender balance + const sender_ptr = try std.fmt.allocPrint(self.allocator, "sender_ptr_{}", .{self.var_counter}); + const sender_balance = try std.fmt.allocPrint(self.allocator, "sender_balance_{}", .{self.var_counter}); + self.var_counter += 1; + + try yul_code.writer().print(" let {s} := mload(0x40)\n", .{sender_ptr}); + try yul_code.writer().print(" mstore({s}, {s})\n", .{ sender_ptr, source_var }); + try yul_code.writer().print(" mstore(add({s}, 0x20), {})\n", .{ sender_ptr, slot }); + try yul_code.writer().print(" let {s} := sload(keccak256({s}, 0x40))\n", .{ sender_balance, sender_ptr }); + + // 2. CRITICAL CHECK: Ensure sender has sufficient balance + try yul_code.writer().print(" if lt({s}, {s}) {{ revert(0, 0) }}\n", .{ sender_balance, amount_var }); + + // 3. Get recipient balance + const recipient_ptr = try std.fmt.allocPrint(self.allocator, "recipient_ptr_{}", .{self.var_counter}); + const recipient_balance = try std.fmt.allocPrint(self.allocator, "recipient_balance_{}", .{self.var_counter}); + self.var_counter += 1; + + try yul_code.writer().print(" let {s} := mload(0x40)\n", .{recipient_ptr}); + try yul_code.writer().print(" mstore({s}, {s})\n", .{ recipient_ptr, dest_var }); + try yul_code.writer().print(" mstore(add({s}, 0x20), {})\n", .{ recipient_ptr, slot }); + try yul_code.writer().print(" let {s} := sload(keccak256({s}, 0x40))\n", .{ recipient_balance, recipient_ptr }); + + // 4. CRITICAL CHECK: Ensure no overflow on addition + const new_recipient_balance = try std.fmt.allocPrint(self.allocator, "new_recipient_balance_{}", .{self.var_counter}); + self.var_counter += 1; + + try yul_code.writer().print(" let {s} := add({s}, {s})\n", .{ new_recipient_balance, recipient_balance, amount_var }); + try yul_code.writer().print(" if lt({s}, {s}) {{ revert(0, 0) }}\n", .{ new_recipient_balance, recipient_balance }); + + // 5. Perform the atomic state changes + const new_sender_balance = try std.fmt.allocPrint(self.allocator, "new_sender_balance_{}", .{self.var_counter}); + self.var_counter += 1; + + try yul_code.writer().print(" let {s} := sub({s}, {s})\n", .{ new_sender_balance, sender_balance, amount_var }); + try yul_code.writer().print(" sstore(keccak256({s}, 0x40), {s})\n", .{ sender_ptr, new_sender_balance }); + try yul_code.writer().print(" sstore(keccak256({s}, 0x40), {s})\n", .{ recipient_ptr, new_recipient_balance }); + + // Clean up memory pointers + self.allocator.free(sender_ptr); + self.allocator.free(sender_balance); + self.allocator.free(recipient_ptr); + self.allocator.free(recipient_balance); + self.allocator.free(new_recipient_balance); + self.allocator.free(new_sender_balance); + + // Return success (1 for boolean true) + const result_var = try std.fmt.allocPrint(self.allocator, "shift_result_{}", .{self.var_counter}); + self.var_counter += 1; + try yul_code.writer().print(" let {s} := 1\n", .{result_var}); + return result_var; + } else |_| { + // Fallback: not a storage mapping, just return false + const result_var = try std.fmt.allocPrint(self.allocator, "shift_result_{}", .{self.var_counter}); + self.var_counter += 1; + try yul_code.writer().print(" let {s} := 0\n", .{result_var}); + return result_var; + } + } + /// Generate try expression fn generateTryExpression(self: *Self, yul_code: *std.ArrayList(u8), try_expr: *const ir.TryExpression) YulCodegenError![]const u8 { // For now, just evaluate the expression normally @@ -998,10 +1240,11 @@ pub const YulCodegen = struct { _ = self; return switch (typ) { .primitive => |prim| switch (prim) { - .u8, .u16, .u32, .u64, .u128, .u256 => "0", + .u8, .u16, .u32, .u64, .u128, .u256, .i8, .i16, .i32, .i64, .i128, .i256 => "0", .bool => "false", .address => "0", .string => "0", + .bytes => "0", }, else => "0", }; diff --git a/src/comptime_eval.zig b/src/comptime_eval.zig index b92e85d..a6468ef 100644 --- a/src/comptime_eval.zig +++ b/src/comptime_eval.zig @@ -27,11 +27,18 @@ pub const ComptimeValue = union(enum) { u64: u64, u128: u128, u256: [32]u8, // Store u256 as byte array + i8: i8, + i16: i16, + i32: i32, + i64: i64, + i128: i128, + i256: [32]u8, // Store i256 as byte array (two's complement) string: []const u8, address: [20]u8, // Ethereum address // Special values undefined_value: void, + tuple: []ComptimeValue, // Tuple values /// Convert to string representation for debugging pub fn toString(self: ComptimeValue, allocator: Allocator) ![]const u8 { @@ -43,9 +50,30 @@ pub const ComptimeValue = union(enum) { .u64 => |v| try std.fmt.allocPrint(allocator, "{}", .{v}), .u128 => |v| try std.fmt.allocPrint(allocator, "{}", .{v}), .u256 => |bytes| try std.fmt.allocPrint(allocator, "0x{}", .{std.fmt.fmtSliceHexUpper(&bytes)}), + .i8 => |v| try std.fmt.allocPrint(allocator, "{}", .{v}), + .i16 => |v| try std.fmt.allocPrint(allocator, "{}", .{v}), + .i32 => |v| try std.fmt.allocPrint(allocator, "{}", .{v}), + .i64 => |v| try std.fmt.allocPrint(allocator, "{}", .{v}), + .i128 => |v| try std.fmt.allocPrint(allocator, "{}", .{v}), + .i256 => |bytes| try std.fmt.allocPrint(allocator, "0x{}", .{std.fmt.fmtSliceHexUpper(&bytes)}), .string => |s| try allocator.dupe(u8, s), .address => |addr| try std.fmt.allocPrint(allocator, "0x{}", .{std.fmt.fmtSliceHexUpper(&addr)}), .undefined_value => "undefined", + .tuple => |elements| { + var result = std.ArrayList(u8).init(allocator); + defer result.deinit(); + + try result.appendSlice("("); + for (elements, 0..) |element, i| { + if (i > 0) try result.appendSlice(", "); + const elem_str = try element.toString(allocator); + defer allocator.free(elem_str); + try result.appendSlice(elem_str); + } + try result.appendSlice(")"); + + return result.toOwnedSlice(); + }, }; } @@ -80,6 +108,30 @@ pub const ComptimeValue = union(enum) { .u256 => |b| std.mem.eql(u8, &a, &b), else => false, }, + .i8 => |a| switch (other) { + .i8 => |b| a == b, + else => false, + }, + .i16 => |a| switch (other) { + .i16 => |b| a == b, + else => false, + }, + .i32 => |a| switch (other) { + .i32 => |b| a == b, + else => false, + }, + .i64 => |a| switch (other) { + .i64 => |b| a == b, + else => false, + }, + .i128 => |a| switch (other) { + .i128 => |b| a == b, + else => false, + }, + .i256 => |a| switch (other) { + .i256 => |b| std.mem.eql(u8, &a, &b), + else => false, + }, .string => |a| switch (other) { .string => |b| std.mem.eql(u8, a, b), else => false, @@ -92,6 +144,16 @@ pub const ComptimeValue = union(enum) { .undefined_value => true, else => false, }, + .tuple => |a| switch (other) { + .tuple => |b| { + if (a.len != b.len) return false; + for (a, b) |a_elem, b_elem| { + if (!a_elem.equals(b_elem)) return false; + } + return true; + }, + else => false, + }, }; } }; @@ -145,6 +207,7 @@ pub const ComptimeEvaluator = struct { .Binary => |*bin| self.evaluateBinary(bin), .Unary => |*unary| self.evaluateUnary(unary), .Comptime => |*comp| self.evaluateComptimeBlock(comp), + .FunctionCall => |*call| self.evaluateFunctionCall(call), else => ComptimeError.NotCompileTimeEvaluable, }; } @@ -164,7 +227,42 @@ pub const ComptimeEvaluator = struct { fn parseIntegerLiteral(self: *ComptimeEvaluator, value_str: []const u8) ComptimeError!ComptimeValue { _ = self; - // Try parsing as different integer types, starting with smallest + // Check if it's a negative number + const is_negative = value_str.len > 0 and value_str[0] == '-'; + const abs_str = if (is_negative) value_str[1..] else value_str; + + // Try parsing as different signed integer types first (if negative) + if (is_negative) { + if (std.fmt.parseInt(i8, abs_str, 10)) |val| { + return ComptimeValue{ .i8 = -val }; + } else |_| {} + + if (std.fmt.parseInt(i16, abs_str, 10)) |val| { + return ComptimeValue{ .i16 = -val }; + } else |_| {} + + if (std.fmt.parseInt(i32, abs_str, 10)) |val| { + return ComptimeValue{ .i32 = -val }; + } else |_| {} + + if (std.fmt.parseInt(i64, abs_str, 10)) |val| { + return ComptimeValue{ .i64 = -val }; + } else |_| {} + + if (std.fmt.parseInt(i128, abs_str, 10)) |val| { + return ComptimeValue{ .i128 = -val }; + } else |_| {} + + // Default to i256 for very large negative numbers + var bytes: [32]u8 = [_]u8{0} ** 32; + const hash = std.hash.CityHash32.hash(abs_str); + std.mem.writeInt(u32, bytes[28..32], hash, .big); + // Set sign bit for negative numbers + bytes[0] |= 0x80; + return ComptimeValue{ .i256 = bytes }; + } + + // Try parsing as different unsigned integer types if (std.fmt.parseInt(u8, value_str, 10)) |val| { return ComptimeValue{ .u8 = val }; } else |_| {} @@ -314,6 +412,328 @@ pub const ComptimeEvaluator = struct { return ComptimeValue{ .undefined_value = {} }; } + /// Evaluate function call (builtin functions only) + fn evaluateFunctionCall(self: *ComptimeEvaluator, call: *ast.FunctionCallExpr) ComptimeError!ComptimeValue { + const func_name = call.name; + + // Check if it's a builtin division function + if (std.mem.eql(u8, func_name, "@divTrunc") or + std.mem.eql(u8, func_name, "@divFloor") or + std.mem.eql(u8, func_name, "@divCeil") or + std.mem.eql(u8, func_name, "@divExact") or + std.mem.eql(u8, func_name, "@divmod")) + { + + // All division functions require exactly 2 arguments + if (call.arguments.len != 2) { + return ComptimeError.InvalidOperation; + } + + // Evaluate both arguments + const lhs = try self.evaluate(&call.arguments[0]); + const rhs = try self.evaluate(&call.arguments[1]); + + // Perform the division operation + if (std.mem.eql(u8, func_name, "@divTrunc")) { + return try self.divTrunc(lhs, rhs); + } else if (std.mem.eql(u8, func_name, "@divFloor")) { + return try self.divFloor(lhs, rhs); + } else if (std.mem.eql(u8, func_name, "@divCeil")) { + return try self.divCeil(lhs, rhs); + } else if (std.mem.eql(u8, func_name, "@divExact")) { + return try self.divExact(lhs, rhs); + } else if (std.mem.eql(u8, func_name, "@divmod")) { + return try self.divMod(lhs, rhs); + } + } + + // Not a recognized builtin function + return ComptimeError.NotCompileTimeEvaluable; + } + + /// Truncating division (toward zero) - using Zig's @divTrunc + fn divTrunc(self: *ComptimeEvaluator, left: ComptimeValue, right: ComptimeValue) ComptimeError!ComptimeValue { + const promoted = try self.promoteTypes(left, right); + return switch (promoted.left) { + .u8 => |a| switch (promoted.right) { + .u8 => |b| if (b == 0) ComptimeError.DivisionByZero else ComptimeValue{ .u8 = a / b }, + else => ComptimeError.TypeMismatch, + }, + .u16 => |a| switch (promoted.right) { + .u16 => |b| if (b == 0) ComptimeError.DivisionByZero else ComptimeValue{ .u16 = a / b }, + else => ComptimeError.TypeMismatch, + }, + .u32 => |a| switch (promoted.right) { + .u32 => |b| if (b == 0) ComptimeError.DivisionByZero else ComptimeValue{ .u32 = a / b }, + else => ComptimeError.TypeMismatch, + }, + .u64 => |a| switch (promoted.right) { + .u64 => |b| if (b == 0) ComptimeError.DivisionByZero else ComptimeValue{ .u64 = a / b }, + else => ComptimeError.TypeMismatch, + }, + .u128 => |a| switch (promoted.right) { + .u128 => |b| if (b == 0) ComptimeError.DivisionByZero else ComptimeValue{ .u128 = a / b }, + else => ComptimeError.TypeMismatch, + }, + .i8 => |a| switch (promoted.right) { + .i8 => |b| if (b == 0) ComptimeError.DivisionByZero else ComptimeValue{ .i8 = @divTrunc(a, b) }, + else => ComptimeError.TypeMismatch, + }, + .i16 => |a| switch (promoted.right) { + .i16 => |b| if (b == 0) ComptimeError.DivisionByZero else ComptimeValue{ .i16 = @divTrunc(a, b) }, + else => ComptimeError.TypeMismatch, + }, + .i32 => |a| switch (promoted.right) { + .i32 => |b| if (b == 0) ComptimeError.DivisionByZero else ComptimeValue{ .i32 = @divTrunc(a, b) }, + else => ComptimeError.TypeMismatch, + }, + .i64 => |a| switch (promoted.right) { + .i64 => |b| if (b == 0) ComptimeError.DivisionByZero else ComptimeValue{ .i64 = @divTrunc(a, b) }, + else => ComptimeError.TypeMismatch, + }, + .i128 => |a| switch (promoted.right) { + .i128 => |b| if (b == 0) ComptimeError.DivisionByZero else ComptimeValue{ .i128 = @divTrunc(a, b) }, + else => ComptimeError.TypeMismatch, + }, + else => ComptimeError.InvalidOperation, + }; + } + + /// Floor division (toward negative infinity) - using Zig's @divFloor + fn divFloor(self: *ComptimeEvaluator, left: ComptimeValue, right: ComptimeValue) ComptimeError!ComptimeValue { + const promoted = try self.promoteTypes(left, right); + return switch (promoted.left) { + .u8 => |a| switch (promoted.right) { + .u8 => |b| if (b == 0) ComptimeError.DivisionByZero else ComptimeValue{ .u8 = a / b }, + else => ComptimeError.TypeMismatch, + }, + .u16 => |a| switch (promoted.right) { + .u16 => |b| if (b == 0) ComptimeError.DivisionByZero else ComptimeValue{ .u16 = a / b }, + else => ComptimeError.TypeMismatch, + }, + .u32 => |a| switch (promoted.right) { + .u32 => |b| if (b == 0) ComptimeError.DivisionByZero else ComptimeValue{ .u32 = a / b }, + else => ComptimeError.TypeMismatch, + }, + .u64 => |a| switch (promoted.right) { + .u64 => |b| if (b == 0) ComptimeError.DivisionByZero else ComptimeValue{ .u64 = a / b }, + else => ComptimeError.TypeMismatch, + }, + .u128 => |a| switch (promoted.right) { + .u128 => |b| if (b == 0) ComptimeError.DivisionByZero else ComptimeValue{ .u128 = a / b }, + else => ComptimeError.TypeMismatch, + }, + .i8 => |a| switch (promoted.right) { + .i8 => |b| if (b == 0) ComptimeError.DivisionByZero else ComptimeValue{ .i8 = @divFloor(a, b) }, + else => ComptimeError.TypeMismatch, + }, + .i16 => |a| switch (promoted.right) { + .i16 => |b| if (b == 0) ComptimeError.DivisionByZero else ComptimeValue{ .i16 = @divFloor(a, b) }, + else => ComptimeError.TypeMismatch, + }, + .i32 => |a| switch (promoted.right) { + .i32 => |b| if (b == 0) ComptimeError.DivisionByZero else ComptimeValue{ .i32 = @divFloor(a, b) }, + else => ComptimeError.TypeMismatch, + }, + .i64 => |a| switch (promoted.right) { + .i64 => |b| if (b == 0) ComptimeError.DivisionByZero else ComptimeValue{ .i64 = @divFloor(a, b) }, + else => ComptimeError.TypeMismatch, + }, + .i128 => |a| switch (promoted.right) { + .i128 => |b| if (b == 0) ComptimeError.DivisionByZero else ComptimeValue{ .i128 = @divFloor(a, b) }, + else => ComptimeError.TypeMismatch, + }, + else => ComptimeError.InvalidOperation, + }; + } + + /// Ceiling division (toward positive infinity) - custom implementation + fn divCeil(self: *ComptimeEvaluator, left: ComptimeValue, right: ComptimeValue) ComptimeError!ComptimeValue { + const promoted = try self.promoteTypes(left, right); + return switch (promoted.left) { + .u8 => |a| switch (promoted.right) { + .u8 => |b| if (b == 0) ComptimeError.DivisionByZero else ComptimeValue{ .u8 = (a + b - 1) / b }, + else => ComptimeError.TypeMismatch, + }, + .u16 => |a| switch (promoted.right) { + .u16 => |b| if (b == 0) ComptimeError.DivisionByZero else ComptimeValue{ .u16 = (a + b - 1) / b }, + else => ComptimeError.TypeMismatch, + }, + .u32 => |a| switch (promoted.right) { + .u32 => |b| if (b == 0) ComptimeError.DivisionByZero else ComptimeValue{ .u32 = (a + b - 1) / b }, + else => ComptimeError.TypeMismatch, + }, + .u64 => |a| switch (promoted.right) { + .u64 => |b| if (b == 0) ComptimeError.DivisionByZero else ComptimeValue{ .u64 = (a + b - 1) / b }, + else => ComptimeError.TypeMismatch, + }, + .u128 => |a| switch (promoted.right) { + .u128 => |b| if (b == 0) ComptimeError.DivisionByZero else ComptimeValue{ .u128 = (a + b - 1) / b }, + else => ComptimeError.TypeMismatch, + }, + .i8 => |a| switch (promoted.right) { + .i8 => |b| if (b == 0) ComptimeError.DivisionByZero else blk: { + const quot = @divTrunc(a, b); + const rem = a - quot * b; + if (rem != 0 and ((a > 0) == (b > 0))) { + break :blk ComptimeValue{ .i8 = quot + 1 }; + } else { + break :blk ComptimeValue{ .i8 = quot }; + } + }, + else => ComptimeError.TypeMismatch, + }, + .i16 => |a| switch (promoted.right) { + .i16 => |b| if (b == 0) ComptimeError.DivisionByZero else blk: { + const quot = @divTrunc(a, b); + const rem = a - quot * b; + if (rem != 0 and ((a > 0) == (b > 0))) { + break :blk ComptimeValue{ .i16 = quot + 1 }; + } else { + break :blk ComptimeValue{ .i16 = quot }; + } + }, + else => ComptimeError.TypeMismatch, + }, + .i32 => |a| switch (promoted.right) { + .i32 => |b| if (b == 0) ComptimeError.DivisionByZero else blk: { + const quot = @divTrunc(a, b); + const rem = a - quot * b; + if (rem != 0 and ((a > 0) == (b > 0))) { + break :blk ComptimeValue{ .i32 = quot + 1 }; + } else { + break :blk ComptimeValue{ .i32 = quot }; + } + }, + else => ComptimeError.TypeMismatch, + }, + .i64 => |a| switch (promoted.right) { + .i64 => |b| if (b == 0) ComptimeError.DivisionByZero else blk: { + const quot = @divTrunc(a, b); + const rem = a - quot * b; + if (rem != 0 and ((a > 0) == (b > 0))) { + break :blk ComptimeValue{ .i64 = quot + 1 }; + } else { + break :blk ComptimeValue{ .i64 = quot }; + } + }, + else => ComptimeError.TypeMismatch, + }, + .i128 => |a| switch (promoted.right) { + .i128 => |b| if (b == 0) ComptimeError.DivisionByZero else blk: { + const quot = @divTrunc(a, b); + const rem = a - quot * b; + if (rem != 0 and ((a > 0) == (b > 0))) { + break :blk ComptimeValue{ .i128 = quot + 1 }; + } else { + break :blk ComptimeValue{ .i128 = quot }; + } + }, + else => ComptimeError.TypeMismatch, + }, + else => ComptimeError.InvalidOperation, + }; + } + + /// Exact division - using Zig's @divExact + fn divExact(self: *ComptimeEvaluator, left: ComptimeValue, right: ComptimeValue) ComptimeError!ComptimeValue { + const promoted = try self.promoteTypes(left, right); + return switch (promoted.left) { + .u8 => |a| switch (promoted.right) { + .u8 => |b| if (b == 0) ComptimeError.DivisionByZero else if (a % b != 0) ComptimeError.InvalidOperation else ComptimeValue{ .u8 = a / b }, + else => ComptimeError.TypeMismatch, + }, + .u16 => |a| switch (promoted.right) { + .u16 => |b| if (b == 0) ComptimeError.DivisionByZero else if (a % b != 0) ComptimeError.InvalidOperation else ComptimeValue{ .u16 = a / b }, + else => ComptimeError.TypeMismatch, + }, + .u32 => |a| switch (promoted.right) { + .u32 => |b| if (b == 0) ComptimeError.DivisionByZero else if (a % b != 0) ComptimeError.InvalidOperation else ComptimeValue{ .u32 = a / b }, + else => ComptimeError.TypeMismatch, + }, + .u64 => |a| switch (promoted.right) { + .u64 => |b| if (b == 0) ComptimeError.DivisionByZero else if (a % b != 0) ComptimeError.InvalidOperation else ComptimeValue{ .u64 = a / b }, + else => ComptimeError.TypeMismatch, + }, + .u128 => |a| switch (promoted.right) { + .u128 => |b| if (b == 0) ComptimeError.DivisionByZero else if (a % b != 0) ComptimeError.InvalidOperation else ComptimeValue{ .u128 = a / b }, + else => ComptimeError.TypeMismatch, + }, + .i8 => |a| switch (promoted.right) { + .i8 => |b| if (b == 0) ComptimeError.DivisionByZero else if (@rem(a, b) != 0) ComptimeError.InvalidOperation else ComptimeValue{ .i8 = @divTrunc(a, b) }, + else => ComptimeError.TypeMismatch, + }, + .i16 => |a| switch (promoted.right) { + .i16 => |b| if (b == 0) ComptimeError.DivisionByZero else if (@rem(a, b) != 0) ComptimeError.InvalidOperation else ComptimeValue{ .i16 = @divTrunc(a, b) }, + else => ComptimeError.TypeMismatch, + }, + .i32 => |a| switch (promoted.right) { + .i32 => |b| if (b == 0) ComptimeError.DivisionByZero else if (@rem(a, b) != 0) ComptimeError.InvalidOperation else ComptimeValue{ .i32 = @divTrunc(a, b) }, + else => ComptimeError.TypeMismatch, + }, + .i64 => |a| switch (promoted.right) { + .i64 => |b| if (b == 0) ComptimeError.DivisionByZero else if (@rem(a, b) != 0) ComptimeError.InvalidOperation else ComptimeValue{ .i64 = @divTrunc(a, b) }, + else => ComptimeError.TypeMismatch, + }, + .i128 => |a| switch (promoted.right) { + .i128 => |b| if (b == 0) ComptimeError.DivisionByZero else if (@rem(a, b) != 0) ComptimeError.InvalidOperation else ComptimeValue{ .i128 = @divTrunc(a, b) }, + else => ComptimeError.TypeMismatch, + }, + else => ComptimeError.InvalidOperation, + }; + } + + /// Division with remainder - returns a tuple value + fn divMod(self: *ComptimeEvaluator, left: ComptimeValue, right: ComptimeValue) ComptimeError!ComptimeValue { + const promoted = try self.promoteTypes(left, right); + + // Create tuple with quotient and remainder + var tuple_elements = std.ArrayList(ComptimeValue).init(self.allocator); + defer tuple_elements.deinit(); + + switch (promoted.left) { + .u32 => |a| switch (promoted.right) { + .u32 => |b| if (b == 0) ComptimeError.DivisionByZero else { + const quot = a / b; + const rem = a % b; + try tuple_elements.append(ComptimeValue{ .u32 = quot }); + try tuple_elements.append(ComptimeValue{ .u32 = rem }); + }, + else => return ComptimeError.TypeMismatch, + }, + .u64 => |a| switch (promoted.right) { + .u64 => |b| if (b == 0) ComptimeError.DivisionByZero else { + const quot = a / b; + const rem = a % b; + try tuple_elements.append(ComptimeValue{ .u64 = quot }); + try tuple_elements.append(ComptimeValue{ .u64 = rem }); + }, + else => return ComptimeError.TypeMismatch, + }, + .i32 => |a| switch (promoted.right) { + .i32 => |b| if (b == 0) ComptimeError.DivisionByZero else { + const quot = @divTrunc(a, b); + const rem = @rem(a, b); + try tuple_elements.append(ComptimeValue{ .i32 = quot }); + try tuple_elements.append(ComptimeValue{ .i32 = rem }); + }, + else => return ComptimeError.TypeMismatch, + }, + .i64 => |a| switch (promoted.right) { + .i64 => |b| if (b == 0) ComptimeError.DivisionByZero else { + const quot = @divTrunc(a, b); + const rem = @rem(a, b); + try tuple_elements.append(ComptimeValue{ .i64 = quot }); + try tuple_elements.append(ComptimeValue{ .i64 = rem }); + }, + else => return ComptimeError.TypeMismatch, + }, + else => return ComptimeError.InvalidOperation, + } + + return ComptimeValue{ .tuple = try tuple_elements.toOwnedSlice() }; + } + /// Define a compile-time constant pub fn defineConstant(self: *ComptimeEvaluator, name: []const u8, value: ComptimeValue) !void { try self.symbol_table.define(name, value); @@ -413,6 +833,18 @@ pub const ComptimeEvaluator = struct { } return v[31] == 1; }, + .i8 => |v| v == 1, + .i16 => |v| v == 1, + .i32 => |v| v == 1, + .i64 => |v| v == 1, + .i128 => |v| v == 1, + .i256 => |v| { + // Check if i256 equals 1 + for (v[0..31]) |byte| { + if (byte != 0) return false; + } + return v[31] == 1; + }, else => false, }; } @@ -427,6 +859,12 @@ pub const ComptimeEvaluator = struct { .u64 => ComptimeValue{ .u64 = 0 }, .u128 => ComptimeValue{ .u128 = 0 }, .u256 => ComptimeValue{ .u256 = [_]u8{0} ** 32 }, + .i8 => ComptimeValue{ .i8 = 0 }, + .i16 => ComptimeValue{ .i16 = 0 }, + .i32 => ComptimeValue{ .i32 = 0 }, + .i64 => ComptimeValue{ .i64 = 0 }, + .i128 => ComptimeValue{ .i128 = 0 }, + .i256 => ComptimeValue{ .i256 = [_]u8{0} ** 32 }, .bool => ComptimeValue{ .bool = false }, else => value, // Return original for non-numeric types }; @@ -462,6 +900,30 @@ pub const ComptimeEvaluator = struct { .u256 => |b| ComptimeValue{ .u256 = try self.addU256(a, b) }, else => ComptimeError.TypeMismatch, }, + .i8 => |a| switch (promoted.right) { + .i8 => |b| ComptimeValue{ .i8 = a +% b }, + else => ComptimeError.TypeMismatch, + }, + .i16 => |a| switch (promoted.right) { + .i16 => |b| ComptimeValue{ .i16 = a +% b }, + else => ComptimeError.TypeMismatch, + }, + .i32 => |a| switch (promoted.right) { + .i32 => |b| ComptimeValue{ .i32 = a +% b }, + else => ComptimeError.TypeMismatch, + }, + .i64 => |a| switch (promoted.right) { + .i64 => |b| ComptimeValue{ .i64 = a +% b }, + else => ComptimeError.TypeMismatch, + }, + .i128 => |a| switch (promoted.right) { + .i128 => |b| ComptimeValue{ .i128 = a +% b }, + else => ComptimeError.TypeMismatch, + }, + .i256 => |a| switch (promoted.right) { + .i256 => |b| ComptimeValue{ .i256 = try self.addI256(a, b) }, + else => ComptimeError.TypeMismatch, + }, else => ComptimeError.InvalidOperation, }; } @@ -493,6 +955,30 @@ pub const ComptimeEvaluator = struct { .u256 => |b| ComptimeValue{ .u256 = try self.subtractU256(a, b) }, else => ComptimeError.TypeMismatch, }, + .i8 => |a| switch (promoted.right) { + .i8 => |b| ComptimeValue{ .i8 = a -% b }, + else => ComptimeError.TypeMismatch, + }, + .i16 => |a| switch (promoted.right) { + .i16 => |b| ComptimeValue{ .i16 = a -% b }, + else => ComptimeError.TypeMismatch, + }, + .i32 => |a| switch (promoted.right) { + .i32 => |b| ComptimeValue{ .i32 = a -% b }, + else => ComptimeError.TypeMismatch, + }, + .i64 => |a| switch (promoted.right) { + .i64 => |b| ComptimeValue{ .i64 = a -% b }, + else => ComptimeError.TypeMismatch, + }, + .i128 => |a| switch (promoted.right) { + .i128 => |b| ComptimeValue{ .i128 = a -% b }, + else => ComptimeError.TypeMismatch, + }, + .i256 => |a| switch (promoted.right) { + .i256 => |b| ComptimeValue{ .i256 = try self.subtractI256(a, b) }, + else => ComptimeError.TypeMismatch, + }, else => ComptimeError.InvalidOperation, }; } @@ -524,6 +1010,30 @@ pub const ComptimeEvaluator = struct { .u256 => |b| ComptimeValue{ .u256 = try self.multiplyU256(a, b) }, else => ComptimeError.TypeMismatch, }, + .i8 => |a| switch (promoted.right) { + .i8 => |b| ComptimeValue{ .i8 = a *% b }, + else => ComptimeError.TypeMismatch, + }, + .i16 => |a| switch (promoted.right) { + .i16 => |b| ComptimeValue{ .i16 = a *% b }, + else => ComptimeError.TypeMismatch, + }, + .i32 => |a| switch (promoted.right) { + .i32 => |b| ComptimeValue{ .i32 = a *% b }, + else => ComptimeError.TypeMismatch, + }, + .i64 => |a| switch (promoted.right) { + .i64 => |b| ComptimeValue{ .i64 = a *% b }, + else => ComptimeError.TypeMismatch, + }, + .i128 => |a| switch (promoted.right) { + .i128 => |b| ComptimeValue{ .i128 = a *% b }, + else => ComptimeError.TypeMismatch, + }, + .i256 => |a| switch (promoted.right) { + .i256 => |b| ComptimeValue{ .i256 = try self.multiplyI256(a, b) }, + else => ComptimeError.TypeMismatch, + }, else => ComptimeError.InvalidOperation, }; } @@ -551,6 +1061,26 @@ pub const ComptimeEvaluator = struct { .u128 => |b| if (b == 0) ComptimeError.DivisionByZero else ComptimeValue{ .u128 = a / b }, else => ComptimeError.TypeMismatch, }, + .i8 => |a| switch (right) { + .i8 => |b| if (b == 0) ComptimeError.DivisionByZero else ComptimeValue{ .i8 = @divTrunc(a, b) }, + else => ComptimeError.TypeMismatch, + }, + .i16 => |a| switch (right) { + .i16 => |b| if (b == 0) ComptimeError.DivisionByZero else ComptimeValue{ .i16 = @divTrunc(a, b) }, + else => ComptimeError.TypeMismatch, + }, + .i32 => |a| switch (right) { + .i32 => |b| if (b == 0) ComptimeError.DivisionByZero else ComptimeValue{ .i32 = @divTrunc(a, b) }, + else => ComptimeError.TypeMismatch, + }, + .i64 => |a| switch (right) { + .i64 => |b| if (b == 0) ComptimeError.DivisionByZero else ComptimeValue{ .i64 = @divTrunc(a, b) }, + else => ComptimeError.TypeMismatch, + }, + .i128 => |a| switch (right) { + .i128 => |b| if (b == 0) ComptimeError.DivisionByZero else ComptimeValue{ .i128 = @divTrunc(a, b) }, + else => ComptimeError.TypeMismatch, + }, else => ComptimeError.InvalidOperation, }; } @@ -578,6 +1108,26 @@ pub const ComptimeEvaluator = struct { .u128 => |b| if (b == 0) ComptimeError.DivisionByZero else ComptimeValue{ .u128 = a % b }, else => ComptimeError.TypeMismatch, }, + .i8 => |a| switch (right) { + .i8 => |b| if (b == 0) ComptimeError.DivisionByZero else ComptimeValue{ .i8 = @rem(a, b) }, + else => ComptimeError.TypeMismatch, + }, + .i16 => |a| switch (right) { + .i16 => |b| if (b == 0) ComptimeError.DivisionByZero else ComptimeValue{ .i16 = @rem(a, b) }, + else => ComptimeError.TypeMismatch, + }, + .i32 => |a| switch (right) { + .i32 => |b| if (b == 0) ComptimeError.DivisionByZero else ComptimeValue{ .i32 = @rem(a, b) }, + else => ComptimeError.TypeMismatch, + }, + .i64 => |a| switch (right) { + .i64 => |b| if (b == 0) ComptimeError.DivisionByZero else ComptimeValue{ .i64 = @rem(a, b) }, + else => ComptimeError.TypeMismatch, + }, + .i128 => |a| switch (right) { + .i128 => |b| if (b == 0) ComptimeError.DivisionByZero else ComptimeValue{ .i128 = @rem(a, b) }, + else => ComptimeError.TypeMismatch, + }, else => ComptimeError.InvalidOperation, }; } @@ -631,6 +1181,51 @@ pub const ComptimeEvaluator = struct { }, else => return ComptimeError.TypeMismatch, }, + .i8 => |a| switch (right) { + .i8 => |b| switch (op) { + .less => a < b, + .less_equal => a <= b, + .greater => a > b, + .greater_equal => a >= b, + }, + else => return ComptimeError.TypeMismatch, + }, + .i16 => |a| switch (right) { + .i16 => |b| switch (op) { + .less => a < b, + .less_equal => a <= b, + .greater => a > b, + .greater_equal => a >= b, + }, + else => return ComptimeError.TypeMismatch, + }, + .i32 => |a| switch (right) { + .i32 => |b| switch (op) { + .less => a < b, + .less_equal => a <= b, + .greater => a > b, + .greater_equal => a >= b, + }, + else => return ComptimeError.TypeMismatch, + }, + .i64 => |a| switch (right) { + .i64 => |b| switch (op) { + .less => a < b, + .less_equal => a <= b, + .greater => a > b, + .greater_equal => a >= b, + }, + else => return ComptimeError.TypeMismatch, + }, + .i128 => |a| switch (right) { + .i128 => |b| switch (op) { + .less => a < b, + .less_equal => a <= b, + .greater => a > b, + .greater_equal => a >= b, + }, + else => return ComptimeError.TypeMismatch, + }, else => return ComptimeError.InvalidOperation, }; return ComptimeValue{ .bool = result }; @@ -824,6 +1419,11 @@ pub const ComptimeEvaluator = struct { .u32 => |a| ComptimeValue{ .u32 = -%a }, .u64 => |a| ComptimeValue{ .u64 = -%a }, .u128 => |a| ComptimeValue{ .u128 = -%a }, + .i8 => |a| ComptimeValue{ .i8 = -a }, + .i16 => |a| ComptimeValue{ .i16 = -a }, + .i32 => |a| ComptimeValue{ .i32 = -a }, + .i64 => |a| ComptimeValue{ .i64 = -a }, + .i128 => |a| ComptimeValue{ .i128 = -a }, else => ComptimeError.InvalidOperation, }; } @@ -909,6 +1509,87 @@ pub const ComptimeEvaluator = struct { return true; } + /// I256 arithmetic operations (two's complement signed arithmetic) + fn addI256(self: *ComptimeEvaluator, a: [32]u8, b: [32]u8) ComptimeError![32]u8 { + _ = self; + var result: [32]u8 = [_]u8{0} ** 32; + var carry: u16 = 0; + + // Add from least significant byte + var i: usize = 31; + while (i < 32) { + const sum = @as(u16, a[i]) + @as(u16, b[i]) + carry; + result[i] = @truncate(sum); + carry = sum >> 8; + if (i == 0) break; + i -= 1; + } + + // Check for overflow (simplified - in practice would need sign bit checking) + if (carry != 0) { + return ComptimeError.IntegerOverflow; + } + + return result; + } + + fn subtractI256(self: *ComptimeEvaluator, a: [32]u8, b: [32]u8) ComptimeError![32]u8 { + _ = self; + var result: [32]u8 = [_]u8{0} ** 32; + var borrow: i16 = 0; + + // Subtract from least significant byte + var i: usize = 31; + while (i < 32) { + const diff = @as(i16, a[i]) - @as(i16, b[i]) - borrow; + if (diff < 0) { + result[i] = @intCast(diff + 256); + borrow = 1; + } else { + result[i] = @intCast(diff); + borrow = 0; + } + if (i == 0) break; + i -= 1; + } + + // Check for underflow (simplified) + if (borrow != 0) { + return ComptimeError.IntegerUnderflow; + } + + return result; + } + + fn multiplyI256(self: *ComptimeEvaluator, a: [32]u8, b: [32]u8) ComptimeError![32]u8 { + _ = self; + // Simplified multiplication for compile-time evaluation + // In practice, you'd want a more sophisticated algorithm + var result: [32]u8 = [_]u8{0} ** 32; + + // Simple byte-by-byte multiplication (may overflow) + var carry: u32 = 0; + for (0..32) |i| { + const prod = @as(u32, a[31 - i]) * @as(u32, b[31 - i]) + carry; + result[31 - i] = @truncate(prod); + carry = prod >> 8; + } + + if (carry != 0) { + return ComptimeError.IntegerOverflow; + } + + return result; + } + + fn isZeroI256(self: *ComptimeEvaluator, value: [32]u8) bool { + _ = self; + for (value) |byte| { + if (byte != 0) return false; + } + return true; + } + /// Type promotion for mixed arithmetic operations fn promoteTypes(self: *ComptimeEvaluator, left: ComptimeValue, right: ComptimeValue) ComptimeError!struct { left: ComptimeValue, right: ComptimeValue } { // If types are the same, no promotion needed @@ -924,6 +1605,12 @@ pub const ComptimeEvaluator = struct { .u64 => |_| .{ .left = ComptimeValue{ .u64 = a }, .right = right }, .u128 => |_| .{ .left = ComptimeValue{ .u128 = a }, .right = right }, .u256 => |_| .{ .left = self.promoteToU256(ComptimeValue{ .u8 = a }), .right = right }, + .i8 => |_| .{ .left = ComptimeValue{ .i8 = @intCast(a) }, .right = right }, + .i16 => |_| .{ .left = ComptimeValue{ .i16 = @intCast(a) }, .right = right }, + .i32 => |_| .{ .left = ComptimeValue{ .i32 = a }, .right = right }, + .i64 => |_| .{ .left = ComptimeValue{ .i64 = a }, .right = right }, + .i128 => |_| .{ .left = ComptimeValue{ .i128 = a }, .right = right }, + .i256 => |_| .{ .left = self.promoteToI256(ComptimeValue{ .u8 = a }), .right = right }, else => ComptimeError.TypeMismatch, }, .u16 => |a| switch (right) { @@ -932,6 +1619,12 @@ pub const ComptimeEvaluator = struct { .u64 => |_| .{ .left = ComptimeValue{ .u64 = a }, .right = right }, .u128 => |_| .{ .left = ComptimeValue{ .u128 = a }, .right = right }, .u256 => |_| .{ .left = self.promoteToU256(ComptimeValue{ .u16 = a }), .right = right }, + .i8 => |_| .{ .left = ComptimeValue{ .i8 = @intCast(a) }, .right = right }, + .i16 => |_| .{ .left = ComptimeValue{ .i16 = @intCast(a) }, .right = right }, + .i32 => |_| .{ .left = ComptimeValue{ .i32 = a }, .right = right }, + .i64 => |_| .{ .left = ComptimeValue{ .i64 = a }, .right = right }, + .i128 => |_| .{ .left = ComptimeValue{ .i128 = a }, .right = right }, + .i256 => |_| .{ .left = self.promoteToI256(ComptimeValue{ .u16 = a }), .right = right }, else => ComptimeError.TypeMismatch, }, .u32 => |a| switch (right) { @@ -940,6 +1633,12 @@ pub const ComptimeEvaluator = struct { .u64 => |_| .{ .left = ComptimeValue{ .u64 = a }, .right = right }, .u128 => |_| .{ .left = ComptimeValue{ .u128 = a }, .right = right }, .u256 => |_| .{ .left = self.promoteToU256(ComptimeValue{ .u32 = a }), .right = right }, + .i8 => |_| .{ .left = ComptimeValue{ .i8 = @intCast(a) }, .right = right }, + .i16 => |_| .{ .left = ComptimeValue{ .i16 = @intCast(a) }, .right = right }, + .i32 => |_| .{ .left = ComptimeValue{ .i32 = @intCast(a) }, .right = right }, + .i64 => |_| .{ .left = ComptimeValue{ .i64 = @intCast(a) }, .right = right }, + .i128 => |_| .{ .left = ComptimeValue{ .i128 = @intCast(a) }, .right = right }, + .i256 => |_| .{ .left = self.promoteToI256(ComptimeValue{ .u32 = a }), .right = right }, else => ComptimeError.TypeMismatch, }, .u64 => |a| switch (right) { @@ -948,6 +1647,12 @@ pub const ComptimeEvaluator = struct { .u32 => |b| .{ .left = left, .right = ComptimeValue{ .u64 = b } }, .u128 => |_| .{ .left = ComptimeValue{ .u128 = a }, .right = right }, .u256 => |_| .{ .left = self.promoteToU256(ComptimeValue{ .u64 = a }), .right = right }, + .i8 => |_| .{ .left = ComptimeValue{ .i8 = @intCast(a) }, .right = right }, + .i16 => |_| .{ .left = ComptimeValue{ .i16 = @intCast(a) }, .right = right }, + .i32 => |_| .{ .left = ComptimeValue{ .i32 = @intCast(a) }, .right = right }, + .i64 => |_| .{ .left = ComptimeValue{ .i64 = @intCast(a) }, .right = right }, + .i128 => |_| .{ .left = ComptimeValue{ .i128 = @intCast(a) }, .right = right }, + .i256 => |_| .{ .left = self.promoteToI256(ComptimeValue{ .u64 = a }), .right = right }, else => ComptimeError.TypeMismatch, }, .u128 => |a| switch (right) { @@ -956,10 +1661,92 @@ pub const ComptimeEvaluator = struct { .u32 => |b| .{ .left = left, .right = ComptimeValue{ .u128 = b } }, .u64 => |b| .{ .left = left, .right = ComptimeValue{ .u128 = b } }, .u256 => |_| .{ .left = self.promoteToU256(ComptimeValue{ .u128 = a }), .right = right }, + .i8 => |_| .{ .left = ComptimeValue{ .i8 = @intCast(a) }, .right = right }, + .i16 => |_| .{ .left = ComptimeValue{ .i16 = @intCast(a) }, .right = right }, + .i32 => |_| .{ .left = ComptimeValue{ .i32 = @intCast(a) }, .right = right }, + .i64 => |_| .{ .left = ComptimeValue{ .i64 = @intCast(a) }, .right = right }, + .i128 => |_| .{ .left = ComptimeValue{ .i128 = @intCast(a) }, .right = right }, + .i256 => |_| .{ .left = self.promoteToI256(ComptimeValue{ .u128 = a }), .right = right }, else => ComptimeError.TypeMismatch, }, .u256 => |_| switch (right) { .u8, .u16, .u32, .u64, .u128 => .{ .left = left, .right = self.promoteToU256(right) }, + .i8, .i16, .i32, .i64, .i128, .i256 => .{ .left = self.promoteToI256(left), .right = self.promoteToI256(right) }, + else => ComptimeError.TypeMismatch, + }, + .i8 => |a| switch (right) { + .u8 => |b| .{ .left = left, .right = ComptimeValue{ .i8 = @intCast(b) } }, + .u16 => |b| .{ .left = left, .right = ComptimeValue{ .i16 = @intCast(b) } }, + .u32 => |b| .{ .left = left, .right = ComptimeValue{ .i32 = @intCast(b) } }, + .u64 => |b| .{ .left = left, .right = ComptimeValue{ .i64 = @intCast(b) } }, + .u128 => |b| .{ .left = left, .right = ComptimeValue{ .i128 = @intCast(b) } }, + .u256 => |_| .{ .left = self.promoteToI256(left), .right = self.promoteToI256(right) }, + .i16 => |_| .{ .left = ComptimeValue{ .i16 = @intCast(a) }, .right = right }, + .i32 => |_| .{ .left = ComptimeValue{ .i32 = @intCast(a) }, .right = right }, + .i64 => |_| .{ .left = ComptimeValue{ .i64 = @intCast(a) }, .right = right }, + .i128 => |_| .{ .left = ComptimeValue{ .i128 = @intCast(a) }, .right = right }, + .i256 => |_| .{ .left = self.promoteToI256(ComptimeValue{ .i8 = a }), .right = right }, + else => ComptimeError.TypeMismatch, + }, + .i16 => |a| switch (right) { + .u8 => |b| .{ .left = left, .right = ComptimeValue{ .i16 = b } }, + .u16 => |b| .{ .left = left, .right = ComptimeValue{ .i16 = @intCast(b) } }, + .u32 => |b| .{ .left = left, .right = ComptimeValue{ .i32 = @intCast(b) } }, + .u64 => |b| .{ .left = left, .right = ComptimeValue{ .i64 = @intCast(b) } }, + .u128 => |b| .{ .left = left, .right = ComptimeValue{ .i128 = @intCast(b) } }, + .u256 => |_| .{ .left = self.promoteToI256(left), .right = self.promoteToI256(right) }, + .i8 => |b| .{ .left = left, .right = ComptimeValue{ .i16 = b } }, + .i32 => |_| .{ .left = ComptimeValue{ .i32 = @intCast(a) }, .right = right }, + .i64 => |_| .{ .left = ComptimeValue{ .i64 = @intCast(a) }, .right = right }, + .i128 => |_| .{ .left = ComptimeValue{ .i128 = @intCast(a) }, .right = right }, + .i256 => |_| .{ .left = self.promoteToI256(ComptimeValue{ .i16 = a }), .right = right }, + else => ComptimeError.TypeMismatch, + }, + .i32 => |a| switch (right) { + .u8 => |b| .{ .left = left, .right = ComptimeValue{ .i32 = b } }, + .u16 => |b| .{ .left = left, .right = ComptimeValue{ .i32 = b } }, + .u32 => |b| .{ .left = left, .right = ComptimeValue{ .i32 = @intCast(b) } }, + .u64 => |b| .{ .left = left, .right = ComptimeValue{ .i64 = @intCast(b) } }, + .u128 => |b| .{ .left = left, .right = ComptimeValue{ .i128 = @intCast(b) } }, + .u256 => |_| .{ .left = self.promoteToI256(left), .right = self.promoteToI256(right) }, + .i8 => |b| .{ .left = left, .right = ComptimeValue{ .i32 = b } }, + .i16 => |b| .{ .left = left, .right = ComptimeValue{ .i32 = b } }, + .i64 => |_| .{ .left = ComptimeValue{ .i64 = a }, .right = right }, + .i128 => |_| .{ .left = ComptimeValue{ .i128 = a }, .right = right }, + .i256 => |_| .{ .left = self.promoteToI256(ComptimeValue{ .i32 = a }), .right = right }, + else => ComptimeError.TypeMismatch, + }, + .i64 => |a| switch (right) { + .u8 => |b| .{ .left = left, .right = ComptimeValue{ .i64 = b } }, + .u16 => |b| .{ .left = left, .right = ComptimeValue{ .i64 = b } }, + .u32 => |b| .{ .left = left, .right = ComptimeValue{ .i64 = b } }, + .u64 => |b| .{ .left = left, .right = ComptimeValue{ .i64 = @intCast(b) } }, + .u128 => |b| .{ .left = left, .right = ComptimeValue{ .i128 = @intCast(b) } }, + .u256 => |_| .{ .left = self.promoteToI256(left), .right = self.promoteToI256(right) }, + .i8 => |b| .{ .left = left, .right = ComptimeValue{ .i64 = b } }, + .i16 => |b| .{ .left = left, .right = ComptimeValue{ .i64 = b } }, + .i32 => |b| .{ .left = left, .right = ComptimeValue{ .i64 = b } }, + .i128 => |_| .{ .left = ComptimeValue{ .i128 = a }, .right = right }, + .i256 => |_| .{ .left = self.promoteToI256(ComptimeValue{ .i64 = a }), .right = right }, + else => ComptimeError.TypeMismatch, + }, + .i128 => |a| switch (right) { + .u8 => |b| .{ .left = left, .right = ComptimeValue{ .i128 = b } }, + .u16 => |b| .{ .left = left, .right = ComptimeValue{ .i128 = b } }, + .u32 => |b| .{ .left = left, .right = ComptimeValue{ .i128 = b } }, + .u64 => |b| .{ .left = left, .right = ComptimeValue{ .i128 = b } }, + .u128 => |b| .{ .left = left, .right = ComptimeValue{ .i128 = @intCast(b) } }, + .u256 => |_| .{ .left = self.promoteToI256(left), .right = self.promoteToI256(right) }, + .i8 => |b| .{ .left = left, .right = ComptimeValue{ .i128 = b } }, + .i16 => |b| .{ .left = left, .right = ComptimeValue{ .i128 = b } }, + .i32 => |b| .{ .left = left, .right = ComptimeValue{ .i128 = b } }, + .i64 => |b| .{ .left = left, .right = ComptimeValue{ .i128 = b } }, + .i256 => |_| .{ .left = self.promoteToI256(ComptimeValue{ .i128 = a }), .right = right }, + else => ComptimeError.TypeMismatch, + }, + .i256 => |_| switch (right) { + .u8, .u16, .u32, .u64, .u128, .u256 => .{ .left = left, .right = self.promoteToI256(right) }, + .i8, .i16, .i32, .i64, .i128 => .{ .left = left, .right = self.promoteToI256(right) }, else => ComptimeError.TypeMismatch, }, else => ComptimeError.TypeMismatch, @@ -984,6 +1771,30 @@ pub const ComptimeEvaluator = struct { return ComptimeValue{ .u256 = bytes }; } + /// Promote any integer value to I256 + fn promoteToI256(self: *ComptimeEvaluator, value: ComptimeValue) ComptimeValue { + _ = self; + var bytes: [32]u8 = [_]u8{0} ** 32; + + switch (value) { + .u8 => |v| bytes[31] = v, + .u16 => |v| std.mem.writeInt(u16, bytes[30..32], v, .big), + .u32 => |v| std.mem.writeInt(u32, bytes[28..32], v, .big), + .u64 => |v| std.mem.writeInt(u64, bytes[24..32], v, .big), + .u128 => |v| std.mem.writeInt(u128, bytes[16..32], v, .big), + .u256 => |v| return ComptimeValue{ .i256 = v }, + .i8 => |v| bytes[31] = @bitCast(v), + .i16 => |v| std.mem.writeInt(i16, bytes[30..32], v, .big), + .i32 => |v| std.mem.writeInt(i32, bytes[28..32], v, .big), + .i64 => |v| std.mem.writeInt(i64, bytes[24..32], v, .big), + .i128 => |v| std.mem.writeInt(i128, bytes[16..32], v, .big), + .i256 => |v| return ComptimeValue{ .i256 = v }, + else => {}, // Should not happen for integer types + } + + return ComptimeValue{ .i256 = bytes }; + } + /// Validate compile-time constant definitions pub fn validateConstant(self: *ComptimeEvaluator, name: []const u8, value: ComptimeValue) ComptimeError!void { _ = self; diff --git a/src/formal_verifier.zig b/src/formal_verifier.zig index fcce582..bdb1292 100644 --- a/src/formal_verifier.zig +++ b/src/formal_verifier.zig @@ -490,7 +490,7 @@ pub const FormalVerifier = struct { _ = self; if (type_ref) |t| { return switch (t.*) { - .U8, .U16, .U32, .U64, .U128, .U256 => MathDomain.Integer, + .U8, .U16, .U32, .U64, .U128, .U256, .I8, .I16, .I32, .I64, .I128, .I256 => MathDomain.Integer, .Bool => MathDomain.BitVector, .Address => MathDomain.BitVector, .String => MathDomain.Array, diff --git a/src/ir.zig b/src/ir.zig index 6ad7241..7701790 100644 --- a/src/ir.zig +++ b/src/ir.zig @@ -80,9 +80,16 @@ pub const Type = union(enum) { u64, u128, u256, + i8, + i16, + i32, + i64, + i128, + i256, bool, address, string, + bytes, pub fn toString(self: PrimitiveType) []const u8 { return switch (self) { @@ -92,9 +99,16 @@ pub const Type = union(enum) { .u64 => "u64", .u128 => "u128", .u256 => "u256", + .i8 => "i8", + .i16 => "i16", + .i32 => "i32", + .i64 => "i64", + .i128 => "i128", + .i256 => "i256", .bool => "bool", .address => "address", .string => "string", + .bytes => "bytes", }; } }; @@ -194,19 +208,47 @@ pub const Type = union(enum) { /// Check if a numeric type can be promoted to another numeric type fn isNumericPromotion(self: *const Type, from: Type.PrimitiveType, to: Type.PrimitiveType) bool { _ = self; - // Define promotion hierarchy: u8 → u16 → u32 → u64 → u128 → u256 - const promotion_order = [_]Type.PrimitiveType{ .u8, .u16, .u32, .u64, .u128, .u256 }; - + // Define promotion hierarchy: + // Unsigned: u8 → u16 → u32 → u64 → u128 → u256 + // Signed: i8 → i16 → i32 → i64 → i128 → i256 + // Mixed: unsigned can promote to signed of same or larger size + const unsigned_promotion = [_]Type.PrimitiveType{ .u8, .u16, .u32, .u64, .u128, .u256 }; + const signed_promotion = [_]Type.PrimitiveType{ .i8, .i16, .i32, .i64, .i128, .i256 }; + + // Check unsigned promotion var from_idx: ?usize = null; var to_idx: ?usize = null; - for (promotion_order, 0..) |typ, i| { + for (unsigned_promotion, 0..) |typ, i| { if (typ == from) from_idx = i; if (typ == to) to_idx = i; } - if (from_idx == null or to_idx == null) return false; - return from_idx.? <= to_idx.?; + if (from_idx != null and to_idx != null) { + return from_idx.? <= to_idx.?; + } + + // Check signed promotion + from_idx = null; + to_idx = null; + + for (signed_promotion, 0..) |typ, i| { + if (typ == from) from_idx = i; + if (typ == to) to_idx = i; + } + + if (from_idx != null and to_idx != null) { + return from_idx.? <= to_idx.?; + } + + // Check unsigned to signed promotion (u8 -> i16, u16 -> i32, etc.) + if (from == .u8 and to == .i16) return true; + if (from == .u16 and to == .i32) return true; + if (from == .u32 and to == .i64) return true; + if (from == .u64 and to == .i128) return true; + if (from == .u128 and to == .i256) return true; + + return false; } /// Get the common type for two types (used in binary operations) @@ -234,29 +276,59 @@ pub const Type = union(enum) { pub fn inferLiteralType(literal: *const Literal) Type { return switch (literal.*) { .integer => |int_str| { - // Parse integer to determine smallest suitable type - if (std.fmt.parseInt(u8, int_str, 10)) |_| { - return Type{ .primitive = .u8 }; - } else |_| {} + // Check if it's a negative number + const is_negative = int_str.len > 0 and int_str[0] == '-'; + const abs_str = if (is_negative) int_str[1..] else int_str; + + if (is_negative) { + // Try parsing as different signed integer types + if (std.fmt.parseInt(i8, abs_str, 10)) |_| { + return Type{ .primitive = .i8 }; + } else |_| {} + + if (std.fmt.parseInt(i16, abs_str, 10)) |_| { + return Type{ .primitive = .i16 }; + } else |_| {} + + if (std.fmt.parseInt(i32, abs_str, 10)) |_| { + return Type{ .primitive = .i32 }; + } else |_| {} + + if (std.fmt.parseInt(i64, abs_str, 10)) |_| { + return Type{ .primitive = .i64 }; + } else |_| {} + + if (std.fmt.parseInt(i128, abs_str, 10)) |_| { + return Type{ .primitive = .i128 }; + } else |_| {} + + // Default to i256 for very large negative numbers + return Type{ .primitive = .i256 }; + } else { + // Parse integer to determine smallest suitable type + if (std.fmt.parseInt(u8, int_str, 10)) |_| { + return Type{ .primitive = .u8 }; + } else |_| {} - if (std.fmt.parseInt(u16, int_str, 10)) |_| { - return Type{ .primitive = .u16 }; - } else |_| {} + if (std.fmt.parseInt(u16, int_str, 10)) |_| { + return Type{ .primitive = .u16 }; + } else |_| {} - if (std.fmt.parseInt(u32, int_str, 10)) |_| { - return Type{ .primitive = .u32 }; - } else |_| {} + if (std.fmt.parseInt(u32, int_str, 10)) |_| { + return Type{ .primitive = .u32 }; + } else |_| {} - if (std.fmt.parseInt(u64, int_str, 10)) |_| { - return Type{ .primitive = .u64 }; - } else |_| {} + if (std.fmt.parseInt(u64, int_str, 10)) |_| { + return Type{ .primitive = .u64 }; + } else |_| {} - if (std.fmt.parseInt(u128, int_str, 10)) |_| { - return Type{ .primitive = .u128 }; - } else |_| {} + if (std.fmt.parseInt(u128, int_str, 10)) |_| { + return Type{ .primitive = .u128 }; + } else |_| {} - // Default to u256 for very large numbers - return Type{ .primitive = .u256 }; + // Default to u256 for very large numbers + return Type{ .primitive = .u256 }; + } }, .string => Type{ .primitive = .string }, .boolean => Type{ .primitive = .bool }, @@ -449,7 +521,6 @@ pub const Contract = struct { storage: []StorageVariable, functions: []Function, events: []Event, - modifiers: []Modifier, allocator: Allocator, pub fn init(allocator: Allocator, name: []const u8) Contract { @@ -458,7 +529,6 @@ pub const Contract = struct { .storage = &[_]StorageVariable{}, .functions = &[_]Function{}, .events = &[_]Event{}, - .modifiers = &[_]Modifier{}, .allocator = allocator, }; } @@ -473,13 +543,9 @@ pub const Contract = struct { for (self.events) |*event| { event.deinit(); } - for (self.modifiers) |*modifier| { - modifier.deinit(); - } self.allocator.free(self.storage); self.allocator.free(self.functions); self.allocator.free(self.events); - self.allocator.free(self.modifiers); } }; @@ -502,6 +568,64 @@ pub const StorageVariable = struct { } }; +/// Function effect metadata for tooling +pub const FunctionEffects = struct { + writes_storage: bool, + reads_storage: bool, + writes_transient: bool, + reads_transient: bool, + emits_logs: bool, + calls_other: bool, + modifies_state: bool, + is_pure: bool, + + pub fn init() FunctionEffects { + return FunctionEffects{ + .writes_storage = false, + .reads_storage = false, + .writes_transient = false, + .reads_transient = false, + .emits_logs = false, + .calls_other = false, + .modifies_state = false, + .is_pure = true, + }; + } + + pub fn markStorageWrite(self: *FunctionEffects) void { + self.writes_storage = true; + self.modifies_state = true; + self.is_pure = false; + } + + pub fn markStorageRead(self: *FunctionEffects) void { + self.reads_storage = true; + self.is_pure = false; + } + + pub fn markTransientWrite(self: *FunctionEffects) void { + self.writes_transient = true; + self.modifies_state = true; + self.is_pure = false; + } + + pub fn markTransientRead(self: *FunctionEffects) void { + self.reads_transient = true; + self.is_pure = false; + } + + pub fn markLogEmission(self: *FunctionEffects) void { + self.emits_logs = true; + self.modifies_state = true; + self.is_pure = false; + } + + pub fn markExternalCall(self: *FunctionEffects) void { + self.calls_other = true; + self.is_pure = false; + } +}; + pub const Function = struct { name: []const u8, visibility: Visibility, @@ -512,6 +636,7 @@ pub const Function = struct { body: Block, state_effects: EffectSet, observable_effects: EffectSet, + effects: FunctionEffects, location: SourceLocation, allocator: Allocator, @@ -574,21 +699,6 @@ pub const EventField = struct { } }; -pub const Modifier = struct { - name: []const u8, - parameters: []Parameter, - body: Block, - location: SourceLocation, - allocator: Allocator, - - pub fn deinit(self: *Modifier) void { - for (self.parameters) |*param| { - param.deinit(self.allocator); - } - self.body.deinit(); - } -}; - pub const Block = struct { statements: []Statement, location: SourceLocation, @@ -804,6 +914,7 @@ pub const Expression = union(enum) { index: IndexExpression, field: FieldExpression, transfer: TransferExpression, + shift: ShiftExpression, old: OldExpression, literal: Literal, identifier: Identifier, @@ -821,6 +932,7 @@ pub const Expression = union(enum) { .index => |*ie| ie.deinit(), .field => |*fe| fe.deinit(), .transfer => |*te| te.deinit(), + .shift => |*se| se.deinit(), .old => |*oe| oe.deinit(), .literal => |*l| l.deinit(), .identifier => |*i| i.deinit(), @@ -838,6 +950,7 @@ pub const Expression = union(enum) { .index => |*ie| ie.location, .field => |*fe| fe.location, .transfer => |*te| te.location, + .shift => |*se| se.location, .old => |*oe| oe.location, .literal => SourceLocation{ .line = 0, .column = 0, .length = 0 }, // Literals don't have location .identifier => |*i| i.location, @@ -961,6 +1074,26 @@ pub const TransferExpression = struct { } }; +pub const ShiftExpression = struct { + mapping: *Expression, + source: *Expression, + dest: *Expression, + amount: *Expression, + location: SourceLocation, + allocator: Allocator, + + pub fn deinit(self: *ShiftExpression) void { + self.mapping.deinit(); + self.allocator.destroy(self.mapping); + self.source.deinit(); + self.allocator.destroy(self.source); + self.dest.deinit(); + self.allocator.destroy(self.dest); + self.amount.deinit(); + self.allocator.destroy(self.amount); + } +}; + pub const OldExpression = struct { expression: *Expression, location: SourceLocation, @@ -1708,6 +1841,10 @@ pub const Validator = struct { _ = transfer; return Type{ .primitive = .bool }; // Transfer operations return success/failure }, + .shift => |*shift| { + _ = shift; + return Type{ .primitive = .bool }; // Shift operations return success/failure + }, .old => |*old| { return self.getExpressionType(old.expression); }, @@ -2022,6 +2159,41 @@ pub const Validator = struct { }); } }, + .shift => |*se| { + try self.validateExpression(se.mapping); + try self.validateExpression(se.source); + try self.validateExpression(se.dest); + try self.validateExpression(se.amount); + + // Check types + const source_type = self.getExpressionType(se.source); + const dest_type = self.getExpressionType(se.dest); + const amount_type = self.getExpressionType(se.amount); + + if (source_type != null and !self.isAddressType(source_type.?)) { + try self.context.addError(ValidationError{ + .message = "Shift source must be address type", + .location = se.source.getLocation(), + .kind = .type_error, + }); + } + + if (dest_type != null and !self.isAddressType(dest_type.?)) { + try self.context.addError(ValidationError{ + .message = "Shift destination must be address type", + .location = se.dest.getLocation(), + .kind = .type_error, + }); + } + + if (amount_type != null and !self.isNumericType(amount_type.?)) { + try self.context.addError(ValidationError{ + .message = "Shift amount must be numeric type", + .location = se.amount.getLocation(), + .kind = .type_error, + }); + } + }, .old => |*oe| { try self.validateExpression(oe.expression); }, @@ -2212,6 +2384,7 @@ pub const IRBuilder = struct { /// Build HIR from AST nodes pub fn buildFromAST(self: *IRBuilder, ast_nodes: []@import("ast.zig").AstNode) anyerror!void { var converter = ASTToHIRConverter.init(self.allocator, &self.program); + defer converter.deinit(); try converter.convertAST(ast_nodes); } @@ -2569,7 +2742,28 @@ pub const JSONSerializer = struct { try writer.print("\"state_effects_count\": {},\n", .{function.state_effects.effects.items.len}); try writeIndent(writer, indent + 1); - try writer.print("\"observable_effects_count\": {}\n", .{function.observable_effects.effects.items.len}); + try writer.print("\"observable_effects_count\": {},\n", .{function.observable_effects.effects.items.len}); + + try writeIndent(writer, indent + 1); + try writer.writeAll("\"effects\": {\n"); + try writeIndent(writer, indent + 2); + try writer.print("\"writes_storage\": {},\n", .{function.effects.writes_storage}); + try writeIndent(writer, indent + 2); + try writer.print("\"reads_storage\": {},\n", .{function.effects.reads_storage}); + try writeIndent(writer, indent + 2); + try writer.print("\"writes_transient\": {},\n", .{function.effects.writes_transient}); + try writeIndent(writer, indent + 2); + try writer.print("\"reads_transient\": {},\n", .{function.effects.reads_transient}); + try writeIndent(writer, indent + 2); + try writer.print("\"emits_logs\": {},\n", .{function.effects.emits_logs}); + try writeIndent(writer, indent + 2); + try writer.print("\"calls_other\": {},\n", .{function.effects.calls_other}); + try writeIndent(writer, indent + 2); + try writer.print("\"modifies_state\": {},\n", .{function.effects.modifies_state}); + try writeIndent(writer, indent + 2); + try writer.print("\"is_pure\": {}\n", .{function.effects.is_pure}); + try writeIndent(writer, indent + 1); + try writer.writeAll("}\n"); try writeIndent(writer, indent); try writer.writeAll("}"); @@ -2680,6 +2874,8 @@ pub const JSONSerializer = struct { pub const ASTToHIRConverter = struct { allocator: Allocator, program: *HIRProgram, + storage_variables: std.HashMap([]const u8, void, std.hash_map.StringContext, std.hash_map.default_max_load_percentage), + transient_variables: std.HashMap([]const u8, void, std.hash_map.StringContext, std.hash_map.default_max_load_percentage), // Import AST types const AstNode = @import("ast.zig").AstNode; @@ -2698,9 +2894,16 @@ pub const ASTToHIRConverter = struct { return ASTToHIRConverter{ .allocator = allocator, .program = program, + .storage_variables = std.HashMap([]const u8, void, std.hash_map.StringContext, std.hash_map.default_max_load_percentage).init(allocator), + .transient_variables = std.HashMap([]const u8, void, std.hash_map.StringContext, std.hash_map.default_max_load_percentage).init(allocator), }; } + pub fn deinit(self: *ASTToHIRConverter) void { + self.storage_variables.deinit(); + self.transient_variables.deinit(); + } + /// Convert a list of AST nodes to HIR pub fn convertAST(self: *ASTToHIRConverter, ast_nodes: []AstNode) anyerror!void { for (ast_nodes) |*node| { @@ -2724,6 +2927,10 @@ pub const ASTToHIRConverter = struct { fn convertContract(self: *ASTToHIRConverter, ast_contract: *ContractNode) anyerror!void { var hir_contract = Contract.init(self.allocator, ast_contract.name); + // Clear previous contract's variable tracking + self.storage_variables.clearRetainingCapacity(); + self.transient_variables.clearRetainingCapacity(); + // Convert contract members var storage_vars = std.ArrayList(StorageVariable).init(self.allocator); defer storage_vars.deinit(); @@ -2740,6 +2947,11 @@ pub const ASTToHIRConverter = struct { if (var_decl.region == .Storage) { const storage_var = try self.convertStorageVariable(var_decl); try storage_vars.append(storage_var); + // Track storage variables + try self.storage_variables.put(var_decl.name, {}); + } else if (var_decl.region == .TStore) { + // Track transient variables + try self.transient_variables.put(var_decl.name, {}); } }, .Function => |*function| { @@ -2760,7 +2972,6 @@ pub const ASTToHIRConverter = struct { hir_contract.storage = try self.allocator.dupe(StorageVariable, storage_vars.items); hir_contract.functions = try self.allocator.dupe(Function, functions.items); hir_contract.events = try self.allocator.dupe(Event, events.items); - hir_contract.modifiers = &[_]Modifier{}; // Empty for now // Add contract to program try self.program.addContract(hir_contract); @@ -2828,6 +3039,7 @@ pub const ASTToHIRConverter = struct { .body = hir_body, .state_effects = try self.computeStateEffects(ast_func), // Compute state effects .observable_effects = try self.computeObservableEffects(ast_func), // Compute observable effects + .effects = try self.computeFunctionEffectMetadata(ast_func), // Compute effect metadata .location = self.convertSourceLocation(ast_func.span), .allocator = self.allocator, }; @@ -2853,6 +3065,183 @@ pub const ASTToHIRConverter = struct { return effects; } + /// Compute function effect metadata for tooling + fn computeFunctionEffectMetadata(self: *ASTToHIRConverter, ast_func: *FunctionNode) anyerror!FunctionEffects { + var effects = FunctionEffects.init(); + + // Analyze function body to determine effects + try self.analyzeFunctionBodyForEffects(&ast_func.body, &effects); + + return effects; + } + + /// Analyze function body for effect metadata + fn analyzeFunctionBodyForEffects(self: *ASTToHIRConverter, block: *BlockNode, effects: *FunctionEffects) anyerror!void { + for (block.statements) |*stmt| { + try self.analyzeStatementForEffectMetadata(stmt, effects); + } + } + + /// Analyze a statement for effect metadata + fn analyzeStatementForEffectMetadata(self: *ASTToHIRConverter, stmt: *StmtNode, effects: *FunctionEffects) anyerror!void { + switch (stmt.*) { + .VariableDecl => |*var_decl| { + if (var_decl.region == .Storage) { + effects.markStorageWrite(); + } else if (var_decl.region == .TStore) { + effects.markTransientWrite(); + } + }, + .Expr => |*expr| { + try self.analyzeExpressionForEffectMetadata(expr, effects); + }, + .If => |*if_stmt| { + try self.analyzeFunctionBodyForEffects(&if_stmt.then_branch, effects); + if (if_stmt.else_branch) |*else_branch| { + try self.analyzeFunctionBodyForEffects(else_branch, effects); + } + }, + .While => |*while_stmt| { + try self.analyzeFunctionBodyForEffects(&while_stmt.body, effects); + }, + .Log => |_| { + effects.markLogEmission(); + }, + .Return => |*return_stmt| { + if (return_stmt.value) |*value| { + try self.analyzeExpressionForEffectMetadata(value, effects); + } + }, + else => { + // Other statement types don't affect our metadata + }, + } + } + + /// Analyze an expression for effect metadata + fn analyzeExpressionForEffectMetadata(self: *ASTToHIRConverter, expr: *ExprNode, effects: *FunctionEffects) anyerror!void { + switch (expr.*) { + .Assignment => |*assign| { + // Check if assignment target is storage or transient + try self.analyzeAssignmentTargetForEffects(assign.target, effects); + // Recursively analyze the value expression + try self.analyzeExpressionForEffectMetadata(assign.value, effects); + }, + .CompoundAssignment => |*comp_assign| { + // Compound assignments read and write + try self.analyzeAssignmentTargetForEffects(comp_assign.target, effects); + try self.analyzeExpressionForEffectMetadata(comp_assign.value, effects); + }, + .Call => |*call| { + // Function calls might call other functions + effects.markExternalCall(); + // Recursively analyze arguments + for (call.arguments) |*arg| { + try self.analyzeExpressionForEffectMetadata(arg, effects); + } + }, + .Index => |*index| { + // Index access might be storage read + try self.analyzeStorageAccessForEffects(index.target, effects, false); + try self.analyzeExpressionForEffectMetadata(index.index, effects); + }, + .FieldAccess => |*field| { + // Field access might be storage read + try self.analyzeStorageAccessForEffects(field.target, effects, false); + }, + .Identifier => |*ident| { + // Check if this is a storage variable access + try self.analyzeIdentifierForEffects(ident, effects); + }, + .Binary => |*binary| { + try self.analyzeExpressionForEffectMetadata(binary.lhs, effects); + try self.analyzeExpressionForEffectMetadata(binary.rhs, effects); + }, + .Unary => |*unary| { + try self.analyzeExpressionForEffectMetadata(unary.operand, effects); + }, + .Literal => |_| { + // Literals don't have effects + }, + else => { + // Handle other expression types as needed + }, + } + } + + /// Analyze assignment target to determine if it's storage/transient write + fn analyzeAssignmentTargetForEffects(self: *ASTToHIRConverter, target: *ExprNode, effects: *FunctionEffects) anyerror!void { + switch (target.*) { + .Identifier => |*ident| { + // Check if this identifier refers to a storage variable + if (self.isStorageVariable(ident.name)) { + effects.markStorageWrite(); + } else if (self.isTransientVariable(ident.name)) { + effects.markTransientWrite(); + } + }, + .Index => |*index| { + // Index into storage mapping/array + try self.analyzeStorageAccessForEffects(index.target, effects, true); + }, + .FieldAccess => |*field| { + // Field access on storage + try self.analyzeStorageAccessForEffects(field.target, effects, true); + }, + else => { + // Other assignment targets + }, + } + } + + /// Analyze storage access (read or write) + fn analyzeStorageAccessForEffects(self: *ASTToHIRConverter, expr: *ExprNode, effects: *FunctionEffects, is_write: bool) anyerror!void { + switch (expr.*) { + .Identifier => |*ident| { + if (self.isStorageVariable(ident.name)) { + if (is_write) { + effects.markStorageWrite(); + } else { + effects.markStorageRead(); + } + } else if (self.isTransientVariable(ident.name)) { + if (is_write) { + effects.markTransientWrite(); + } else { + effects.markTransientRead(); + } + } + }, + else => { + // For complex expressions, assume storage access + if (is_write) { + effects.markStorageWrite(); + } else { + effects.markStorageRead(); + } + }, + } + } + + /// Analyze identifier for storage read effects + fn analyzeIdentifierForEffects(self: *ASTToHIRConverter, ident: *@import("ast.zig").IdentifierExpr, effects: *FunctionEffects) anyerror!void { + if (self.isStorageVariable(ident.name)) { + effects.markStorageRead(); + } else if (self.isTransientVariable(ident.name)) { + effects.markTransientRead(); + } + } + + /// Check if an identifier refers to a storage variable + fn isStorageVariable(self: *ASTToHIRConverter, name: []const u8) bool { + return self.storage_variables.contains(name); + } + + /// Check if an identifier refers to a transient variable + fn isTransientVariable(self: *ASTToHIRConverter, name: []const u8) bool { + return self.transient_variables.contains(name); + } + /// Analyze a block for state effects fn analyzeBlockForStateEffects(self: *ASTToHIRConverter, block: *BlockNode, effects: *EffectSet) anyerror!void { for (block.statements) |*stmt| { @@ -3425,6 +3814,18 @@ pub const ASTToHIRConverter = struct { }, }; }, + .Shift => |*shift| { + hir_expr.* = Expression{ + .shift = ShiftExpression{ + .mapping = try self.convertExpression(shift.mapping), + .source = try self.convertExpression(shift.source), + .dest = try self.convertExpression(shift.dest), + .amount = try self.convertExpression(shift.amount), + .location = self.convertSourceLocation(shift.span), + .allocator = self.allocator, + }, + }; + }, else => { // Create a placeholder literal for unsupported expressions hir_expr.* = Expression{ @@ -3459,7 +3860,14 @@ pub const ASTToHIRConverter = struct { .U64 => Type{ .primitive = .u64 }, .U128 => Type{ .primitive = .u128 }, .U256 => Type{ .primitive = .u256 }, + .I8 => Type{ .primitive = .i8 }, + .I16 => Type{ .primitive = .i16 }, + .I32 => Type{ .primitive = .i32 }, + .I64 => Type{ .primitive = .i64 }, + .I128 => Type{ .primitive = .i128 }, + .I256 => Type{ .primitive = .i256 }, .String => Type{ .primitive = .string }, + .Bytes => Type{ .primitive = .bytes }, .Mapping => |*mapping| { const key_type = try self.allocator.create(Type); const value_type = try self.allocator.create(Type); diff --git a/src/lexer.zig b/src/lexer.zig index b21313d..66efba1 100644 --- a/src/lexer.zig +++ b/src/lexer.zig @@ -51,6 +51,13 @@ pub const TokenType = enum { Try, Catch, + // Transfer/shift keywords + From, + + // Type keywords + Map, + Bytes, + // Identifiers and literals Identifier, StringLiteral, @@ -164,6 +171,9 @@ pub const Lexer = struct { .{ "error", .Error }, .{ "try", .Try }, .{ "catch", .Catch }, + .{ "from", .From }, + .{ "map", .Map }, + .{ "bytes", .Bytes }, }); pub fn init(allocator: Allocator, source: []const u8) Lexer { diff --git a/src/main.zig b/src/main.zig index d5e8431..7e391aa 100644 --- a/src/main.zig +++ b/src/main.zig @@ -479,8 +479,9 @@ fn formatTypeRef(typ: lib.TypeRef) []const u8 { .U128 => "u128", .U256 => "u256", .String => "string", + .Bytes => "bytes", .Slice => "slice[T]", - .Mapping => "mapping[K,V]", + .Mapping => "map[K,V]", .DoubleMap => "doublemap[K1,K2,V]", .Identifier => |name| name, }; diff --git a/src/parser.zig b/src/parser.zig index 99bca6b..a71fa03 100644 --- a/src/parser.zig +++ b/src/parser.zig @@ -20,7 +20,7 @@ pub const ParserError = error{ InvalidReturnType, }; -/// Parser for ZigOra DSL +/// Parser for Ora pub const Parser = struct { tokens: []const Token, current: usize, @@ -285,7 +285,7 @@ pub const Parser = struct { /// Parse function parameter fn parseParameter(self: *Parser) ParserError!ast.ParamNode { - const name_token = try self.consume(.Identifier, "Expected parameter name"); + const name_token = try self.consumeIdentifierOrKeyword("Expected parameter name"); _ = try self.consume(.Colon, "Expected ':' after parameter name"); const param_type = try self.parseType(); @@ -302,6 +302,51 @@ pub const Parser = struct { /// Parse type reference fn parseType(self: *Parser) ParserError!ast.TypeRef { + // Handle map type directly + if (self.match(.Map)) { + _ = try self.consume(.LeftBracket, "Expected '[' after 'map'"); + const key_type = try self.allocator.create(ast.TypeRef); + errdefer self.allocator.destroy(key_type); + key_type.* = try self.parseType(); + _ = try self.consume(.Comma, "Expected ',' after map key type"); + const value_type = try self.allocator.create(ast.TypeRef); + errdefer { + ast.deinitTypeRef(self.allocator, key_type); + self.allocator.destroy(key_type); + self.allocator.destroy(value_type); + } + value_type.* = try self.parseType(); + _ = try self.consume(.RightBracket, "Expected ']' after map value type"); + + return ast.TypeRef{ .Mapping = ast.MappingType{ + .key = key_type, + .value = value_type, + } }; + } + + // Handle bytes type directly + if (self.match(.Bytes)) { + return .Bytes; + } + + // Handle array types [T; N] and [T] + if (self.match(.LeftBracket)) { + const elem_type = try self.allocator.create(ast.TypeRef); + errdefer self.allocator.destroy(elem_type); + elem_type.* = try self.parseType(); + + if (self.match(.Semicolon)) { + // Fixed array: [T; N] + _ = try self.consume(.IntegerLiteral, "Expected array size after ';'"); + _ = try self.consume(.RightBracket, "Expected ']' after array size"); + return ast.TypeRef{ .Slice = elem_type }; // For now, treat as slice + } else { + // Dynamic array: [T] + _ = try self.consume(.RightBracket, "Expected ']' after array element type"); + return ast.TypeRef{ .Slice = elem_type }; + } + } + if (self.match(.Identifier)) { const type_name = self.previous().lexeme; @@ -314,6 +359,12 @@ pub const Parser = struct { if (std.mem.eql(u8, type_name, "u64")) return .U64; if (std.mem.eql(u8, type_name, "u128")) return .U128; if (std.mem.eql(u8, type_name, "u256")) return .U256; + if (std.mem.eql(u8, type_name, "i8")) return .I8; + if (std.mem.eql(u8, type_name, "i16")) return .I16; + if (std.mem.eql(u8, type_name, "i32")) return .I32; + if (std.mem.eql(u8, type_name, "i64")) return .I64; + if (std.mem.eql(u8, type_name, "i128")) return .I128; + if (std.mem.eql(u8, type_name, "i256")) return .I256; if (std.mem.eql(u8, type_name, "string")) return .String; // Check for complex types @@ -326,27 +377,6 @@ pub const Parser = struct { return ast.TypeRef{ .Slice = elem_type }; } - if (std.mem.eql(u8, type_name, "mapping")) { - _ = try self.consume(.LeftBracket, "Expected '[' after 'mapping'"); - const key_type = try self.allocator.create(ast.TypeRef); - errdefer self.allocator.destroy(key_type); - key_type.* = try self.parseType(); - _ = try self.consume(.Comma, "Expected ',' after mapping key type"); - const value_type = try self.allocator.create(ast.TypeRef); - errdefer { - ast.deinitTypeRef(self.allocator, key_type); - self.allocator.destroy(key_type); - self.allocator.destroy(value_type); - } - value_type.* = try self.parseType(); - _ = try self.consume(.RightBracket, "Expected ']' after mapping value type"); - - return ast.TypeRef{ .Mapping = ast.MappingType{ - .key = key_type, - .value = value_type, - } }; - } - if (std.mem.eql(u8, type_name, "doublemap")) { _ = try self.consume(.LeftBracket, "Expected '[' after 'doublemap'"); const key1_type = try self.allocator.create(ast.TypeRef); @@ -449,14 +479,53 @@ pub const Parser = struct { break :blk true; } } else { - // For stack variables (default region), check for var - break :blk self.match(.Var); + // For stack variables (default region), check for var or let + if (self.match(.Var)) { + break :blk true; + } else if (self.match(.Let)) { + break :blk false; + } else { + break :blk false; // Default to immutable + } } }; - const name_token = try self.consume(.Identifier, "Expected variable name"); - _ = try self.consume(.Colon, "Expected ':' after variable name"); - const var_type = try self.parseType(); + // Check for tuple unpacking: let (a, b) = expr + var tuple_names: ?[][]const u8 = null; + var name_token: lexer.Token = undefined; + var var_type: ast.TypeRef = undefined; + + if (self.check(.LeftParen)) { + // Tuple unpacking + _ = self.advance(); // consume '(' + + var names = std.ArrayList([]const u8).init(self.allocator); + defer names.deinit(); + + // Parse tuple variable names + if (!self.check(.RightParen)) { + repeat: while (true) { + const tuple_name = try self.consume(.Identifier, "Expected variable name in tuple"); + try names.append(tuple_name.lexeme); + + if (!self.match(.Comma)) break :repeat; + } + } + + _ = try self.consume(.RightParen, "Expected ')' after tuple variables"); + + // For tuple unpacking, we don't specify explicit type yet (inferred from RHS) + _ = try self.consume(.Equal, "Expected '=' after tuple variables"); + + tuple_names = try names.toOwnedSlice(); + name_token = self.previous(); // Use ')' token for span + var_type = ast.TypeRef.Unknown; // Will be inferred + } else { + // Regular variable declaration + name_token = try self.consume(.Identifier, "Expected variable name"); + _ = try self.consume(.Colon, "Expected ':' after variable name"); + var_type = try self.parseType(); + } // Parse optional initializer var initializer: ?ast.ExprNode = null; @@ -467,7 +536,7 @@ pub const Parser = struct { _ = self.match(.Semicolon); // Optional semicolon return ast.VariableDeclNode{ - .name = name_token.lexeme, + .name = if (tuple_names) |_| "" else name_token.lexeme, // Empty name for tuple unpacking .region = region, .mutable = is_mutable, .locked = is_locked, @@ -478,6 +547,7 @@ pub const Parser = struct { .column = name_token.column, .length = @intCast(name_token.lexeme.len), }, + .tuple_names = tuple_names, }; } @@ -766,6 +836,33 @@ pub const Parser = struct { fn parseAssignment(self: *Parser) ParserError!ast.ExprNode { const expr = try self.parseLogicalOr(); + // Check for shift syntax: mapping from source -> dest : amount + if (self.match(.From)) { + const from_token = self.previous(); + const source = try self.parseLogicalOr(); + _ = try self.consume(.Arrow, "Expected '->' in shift expression"); + const dest = try self.parseLogicalOr(); + _ = try self.consume(.Colon, "Expected ':' in shift expression"); + const amount = try self.parseAssignment(); + + const mapping_ptr = try self.allocator.create(ast.ExprNode); + mapping_ptr.* = expr; + const source_ptr = try self.allocator.create(ast.ExprNode); + source_ptr.* = source; + const dest_ptr = try self.allocator.create(ast.ExprNode); + dest_ptr.* = dest; + const amount_ptr = try self.allocator.create(ast.ExprNode); + amount_ptr.* = amount; + + return ast.ExprNode{ .Shift = ast.ShiftExpr{ + .mapping = mapping_ptr, + .source = source_ptr, + .dest = dest_ptr, + .amount = amount_ptr, + .span = makeSpan(from_token), + } }; + } + if (self.match(.Equal)) { const value = try self.parseAssignment(); const expr_ptr = try self.allocator.create(ast.ExprNode); @@ -1028,18 +1125,48 @@ pub const Parser = struct { } }; } else if (self.match(.LeftBracket)) { const index = try self.parseExpression(); - _ = try self.consume(.RightBracket, "Expected ']' after array index"); - - const expr_ptr = try self.allocator.create(ast.ExprNode); - expr_ptr.* = expr; - const index_ptr = try self.allocator.create(ast.ExprNode); - index_ptr.* = index; - expr = ast.ExprNode{ .Index = ast.IndexExpr{ - .target = expr_ptr, - .index = index_ptr, - .span = makeSpan(self.previous()), - } }; + // Check for double mapping access: target[key1, key2] + if (self.match(.Comma)) { + const second_index = try self.parseExpression(); + _ = try self.consume(.RightBracket, "Expected ']' after double mapping index"); + + const expr_ptr = try self.allocator.create(ast.ExprNode); + expr_ptr.* = expr; + const index_ptr = try self.allocator.create(ast.ExprNode); + index_ptr.* = index; + const second_index_ptr = try self.allocator.create(ast.ExprNode); + second_index_ptr.* = second_index; + + // Create a nested index expression for double mapping: target[key1][key2] + const first_index = ast.ExprNode{ .Index = ast.IndexExpr{ + .target = expr_ptr, + .index = index_ptr, + .span = makeSpan(self.previous()), + } }; + + const first_index_ptr = try self.allocator.create(ast.ExprNode); + first_index_ptr.* = first_index; + + expr = ast.ExprNode{ .Index = ast.IndexExpr{ + .target = first_index_ptr, + .index = second_index_ptr, + .span = makeSpan(self.previous()), + } }; + } else { + _ = try self.consume(.RightBracket, "Expected ']' after array index"); + + const expr_ptr = try self.allocator.create(ast.ExprNode); + expr_ptr.* = expr; + const index_ptr = try self.allocator.create(ast.ExprNode); + index_ptr.* = index; + + expr = ast.ExprNode{ .Index = ast.IndexExpr{ + .target = expr_ptr, + .index = index_ptr, + .span = makeSpan(self.previous()), + } }; + } } else { break; } @@ -1126,8 +1253,8 @@ pub const Parser = struct { } } }; } - // Identifiers - if (self.match(.Identifier)) { + // Identifiers (including keywords that can be used as identifiers) + if (self.match(.Identifier) or self.matchKeywordAsIdentifier()) { const token = self.previous(); return ast.ExprNode{ .Identifier = ast.IdentifierExpr{ .name = token.lexeme, @@ -1177,11 +1304,96 @@ pub const Parser = struct { } }; } - // Parenthesized expressions + // Builtin functions starting with @ + if (self.match(.At)) { + const at_token = self.previous(); + const name_token = try self.consume(.Identifier, "Expected builtin function name after '@'"); + + // Check if it's a valid builtin function + const builtin_name = name_token.lexeme; + if (std.mem.eql(u8, builtin_name, "divTrunc") or + std.mem.eql(u8, builtin_name, "divFloor") or + std.mem.eql(u8, builtin_name, "divCeil") or + std.mem.eql(u8, builtin_name, "divExact") or + std.mem.eql(u8, builtin_name, "divmod")) + { + _ = try self.consume(.LeftParen, "Expected '(' after builtin function name"); + + var args = std.ArrayList(ast.ExprNode).init(self.allocator); + defer args.deinit(); + + if (!self.check(.RightParen)) { + const first_arg = try self.parseExpression(); + try args.append(first_arg); + + while (self.match(.Comma)) { + const arg = try self.parseExpression(); + try args.append(arg); + } + } + + _ = try self.consume(.RightParen, "Expected ')' after arguments"); + + // Create the builtin function call + const full_name = try std.fmt.allocPrint(self.allocator, "@{s}", .{builtin_name}); + + return ast.ExprNode{ .FunctionCall = ast.FunctionCallExpr{ + .name = full_name, + .arguments = try args.toOwnedSlice(), + .span = makeSpan(at_token), + } }; + } else { + return self.errorAtCurrent("Unknown builtin function"); + } + } + + // Parenthesized expressions or tuples if (self.match(.LeftParen)) { - const expr = try self.parseExpression(); - _ = try self.consume(.RightParen, "Expected ')' after expression"); - return expr; + const paren_token = self.previous(); + + // Check for empty tuple + if (self.check(.RightParen)) { + _ = self.advance(); + var empty_elements = std.ArrayList(ast.ExprNode).init(self.allocator); + defer empty_elements.deinit(); + + return ast.ExprNode{ .Tuple = ast.TupleExpr{ + .elements = try empty_elements.toOwnedSlice(), + .span = makeSpan(paren_token), + } }; + } + + const first_expr = try self.parseExpression(); + + // Check if it's a tuple (has comma) + if (self.match(.Comma)) { + var elements = std.ArrayList(ast.ExprNode).init(self.allocator); + defer elements.deinit(); + + try elements.append(first_expr); + + // Handle trailing comma case: (a,) + if (!self.check(.RightParen)) { + repeat: while (true) { + const element = try self.parseExpression(); + try elements.append(element); + + if (!self.match(.Comma)) break :repeat; + if (self.check(.RightParen)) break :repeat; // Trailing comma + } + } + + _ = try self.consume(.RightParen, "Expected ')' after tuple elements"); + + return ast.ExprNode{ .Tuple = ast.TupleExpr{ + .elements = try elements.toOwnedSlice(), + .span = makeSpan(paren_token), + } }; + } else { + // Single parenthesized expression + _ = try self.consume(.RightParen, "Expected ')' after expression"); + return first_expr; + } } return self.errorAtCurrent("Expected expression"); @@ -1254,7 +1466,7 @@ pub const Parser = struct { if (!self.check(.RightParen)) { repeat: while (true) { - const field_name = try self.consume(.Identifier, "Expected field name"); + const field_name = try self.consumeIdentifierOrKeyword("Expected field name"); _ = try self.consume(.Colon, "Expected ':' after field name"); const field_type = try self.parseType(); @@ -1324,6 +1536,35 @@ pub const Parser = struct { std.debug.print("Parser error at line {}, column {}: {s}\n", .{ current_token.line, current_token.column, message }); return ParserError.UnexpectedToken; } + + /// Consume an identifier or keyword that can be used as an identifier in certain contexts + fn consumeIdentifierOrKeyword(self: *Parser, message: []const u8) ParserError!Token { + const current_token = self.peek(); + if (current_token.type == .Identifier or self.isKeywordThatCanBeIdentifier(current_token.type)) { + return self.advance(); + } + + std.debug.print("Parser error: {s} (got {s})\n", .{ message, @tagName(current_token.type) }); + return ParserError.ExpectedToken; + } + + /// Check if a keyword can be used as an identifier in certain contexts + fn isKeywordThatCanBeIdentifier(self: *Parser, token_type: TokenType) bool { + _ = self; + return switch (token_type) { + .From => true, // 'from' can be used as a parameter name in log declarations + else => false, + }; + } + + /// Match a keyword that can be used as an identifier + fn matchKeywordAsIdentifier(self: *Parser) bool { + if (self.isKeywordThatCanBeIdentifier(self.peek().type)) { + _ = self.advance(); + return true; + } + return false; + } }; /// Helper extension for Token to create SourceSpan diff --git a/src/semantics.zig b/src/semantics.zig index 83aadc5..859d751 100644 --- a/src/semantics.zig +++ b/src/semantics.zig @@ -55,7 +55,14 @@ pub const Diagnostic = struct { pub fn format(self: Diagnostic, comptime fmt: []const u8, options: std.fmt.FormatOptions, writer: anytype) !void { _ = fmt; _ = options; - try writer.print("{s} at line {}, column {}: {s}", .{ @tagName(self.severity), self.span.line, self.span.column, self.message }); + + // Safely handle potentially invalid message pointers + const safe_message = if (self.message.len == 0) + "" + else + self.message; + + try writer.print("{s} at line {}, column {}: {s}", .{ @tagName(self.severity), self.span.line, self.span.column, safe_message }); } }; @@ -99,6 +106,19 @@ pub const SemanticAnalyzer = struct { in_loop: bool, in_assignment_target: bool, // Flag to indicate if we are currently analyzing an assignment target + // Immutable variable tracking + current_contract: ?*ast.ContractNode, + immutable_variables: std.HashMap([]const u8, ImmutableVarInfo, std.hash_map.StringContext, std.hash_map.default_max_load_percentage), + in_constructor: bool, // Flag to indicate if we're in a constructor (init function) + + /// Information about an immutable variable + const ImmutableVarInfo = struct { + name: []const u8, + declared_span: ast.SourceSpan, + initialized: bool, + init_span: ?ast.SourceSpan, + }; + pub fn init(allocator: std.mem.Allocator) SemanticAnalyzer { return SemanticAnalyzer{ .allocator = allocator, @@ -111,6 +131,9 @@ pub const SemanticAnalyzer = struct { .current_function = null, .in_loop = false, .in_assignment_target = false, + .current_contract = null, + .immutable_variables = std.HashMap([]const u8, ImmutableVarInfo, std.hash_map.StringContext, std.hash_map.default_max_load_percentage).init(allocator), + .in_constructor = false, }; } @@ -126,6 +149,7 @@ pub const SemanticAnalyzer = struct { self.formal_verifier.deinit(); self.optimizer.deinit(); self.diagnostics.deinit(); + self.immutable_variables.deinit(); } /// Perform complete semantic analysis on AST nodes @@ -237,18 +261,35 @@ pub const SemanticAnalyzer = struct { /// Analyze contract declaration fn analyzeContract(self: *SemanticAnalyzer, contract: *ast.ContractNode) SemanticError!void { + // Set current contract for immutable variable tracking + self.current_contract = contract; + defer self.current_contract = null; + + // Clear immutable variables from previous contract + self.immutable_variables.clearRetainingCapacity(); + // Initialize contract context var contract_ctx = ContractContext.init(self.allocator, contract.name); // Ensure cleanup on error - this guarantees memory is freed even if analysis fails defer contract_ctx.deinit(); - // First pass: collect contract member names for context (symbols already in type checker) + // First pass: collect contract member names and immutable variables for (contract.body) |*member| { switch (member.*) { .VariableDecl => |*var_decl| { if (var_decl.region == .Storage or var_decl.region == .Immutable) { try contract_ctx.storage_variables.append(var_decl.name); } + + // Track immutable variables (including storage const) + if (var_decl.region == .Immutable or (var_decl.region == .Storage and !var_decl.mutable)) { + try self.immutable_variables.put(var_decl.name, ImmutableVarInfo{ + .name = var_decl.name, + .declared_span = var_decl.span, + .initialized = var_decl.value != null, + .init_span = if (var_decl.value != null) var_decl.span else null, + }); + } }, .LogDecl => |*log_decl| { try contract_ctx.events.append(log_decl.name); @@ -269,6 +310,10 @@ pub const SemanticAnalyzer = struct { } contract_ctx.has_init = true; contract_ctx.init_is_public = function.pub_; + + // Set constructor flag for immutable variable validation + self.in_constructor = true; + defer self.in_constructor = false; } try contract_ctx.functions.append(function.name); @@ -286,6 +331,9 @@ pub const SemanticAnalyzer = struct { } } + // Validate all immutable variables are initialized + try self.validateImmutableInitialization(); + // Validate contract after all members are analyzed try self.validateContract(&contract_ctx); } @@ -296,35 +344,8 @@ pub const SemanticAnalyzer = struct { self.current_function = function.name; defer self.current_function = prev_function; - // Create function scope for semantic analysis that inherits from global scope - // This ensures storage variables declared at contract level are visible in functions - var func_scope = typer.SymbolTable.init(self.allocator, &self.type_checker.global_scope); - defer func_scope.deinit(); - - // Temporarily switch to function scope for identifier lookup - const prev_scope = self.type_checker.current_scope; - self.type_checker.current_scope = &func_scope; - defer self.type_checker.current_scope = prev_scope; - - // Add function parameters to the function scope - for (function.parameters) |*param| { - const param_type = self.type_checker.convertAstTypeToOraType(¶m.typ) catch |err| { - switch (err) { - typer.TyperError.TypeMismatch => return SemanticError.TypeMismatch, - typer.TyperError.OutOfMemory => return SemanticError.OutOfMemory, - else => return SemanticError.TypeMismatch, - } - }; - - const param_symbol = typer.Symbol{ - .name = param.name, - .typ = param_type, - .region = .Stack, - .mutable = false, // Parameters are immutable by default - .span = param.span, - }; - try func_scope.declare(param_symbol); - } + // Note: The type checker has already validated the function body in Phase 1 + // The semantic analyzer should not create new scopes or interfere with type checker scopes // Validate init function requirements if (std.mem.eql(u8, function.name, "init")) { @@ -422,6 +443,8 @@ pub const SemanticAnalyzer = struct { } } } + + // Note: Variable is added to symbol table by type checker during type checking phase } /// Analyze log declaration @@ -457,6 +480,9 @@ pub const SemanticAnalyzer = struct { .Log => |*log| { try self.analyzeLogStatement(log); }, + .Lock => |*lock| { + try self.analyzeExpression(&lock.path); + }, .Break, .Continue => |span| { if (!self.in_loop) { try self.addError("Break/continue outside loop", span); @@ -522,16 +548,26 @@ pub const SemanticAnalyzer = struct { try self.analyzeExpression(error_cast.operand); // TODO: Validate target type is error union type }, + .Shift => |*shift| { + try self.analyzeShiftExpression(shift); + }, .Identifier => |*ident| { - // Validate identifier exists in scope + // Note: Identifier existence is already validated by the type checker in Phase 1 + // The semantic analyzer focuses on higher-level semantic validation + + // Check for immutable variable assignment attempts (only for storage/immutable variables) if (self.type_checker.current_scope.lookup(ident.name)) |symbol| { - // Check for immutable variable assignment attempts - if (symbol.region == .Immutable and self.in_assignment_target) { - try self.addError("Cannot assign to immutable variable", ident.span); + if ((symbol.region == .Immutable or (symbol.region == .Storage and !symbol.mutable)) and self.in_assignment_target) { + if (!self.in_constructor) { + const var_type = if (symbol.region == .Immutable) "immutable" else "storage const"; + const message = std.fmt.allocPrint(self.allocator, "Cannot assign to {s} variable '{s}' outside constructor", .{ var_type, ident.name }) catch "Cannot assign to variable outside constructor"; + defer if (!std.mem.eql(u8, message, "Cannot assign to variable outside constructor")) self.allocator.free(message); + try self.addError(message, ident.span); + } + // Constructor assignment is handled in analyzeAssignment } - } else { - try self.addError("Undeclared identifier", ident.span); } + // Note: Don't error on undeclared identifiers - the type checker handles that }, .Literal => |*literal| { // Literals are always valid, but check for potential overflow @@ -568,12 +604,32 @@ pub const SemanticAnalyzer = struct { self.in_assignment_target = false; try self.analyzeExpression(assign.value); - // Check if target is an immutable variable at the top level + // Check if target is an immutable variable if (assign.target.* == .Identifier) { const ident = assign.target.Identifier; if (self.type_checker.current_scope.lookup(ident.name)) |symbol| { - if (symbol.region == .Immutable) { - try self.addError("Cannot assign to immutable variable", ident.span); + if (symbol.region == .Immutable or (symbol.region == .Storage and !symbol.mutable)) { + if (self.in_constructor) { + // Allow assignment in constructor, but track initialization + if (self.immutable_variables.getPtr(ident.name)) |info| { + if (info.initialized) { + const var_type = if (symbol.region == .Immutable) "Immutable" else "Storage const"; + const message = std.fmt.allocPrint(self.allocator, "{s} variable '{s}' is already initialized", .{ var_type, ident.name }) catch "Variable is already initialized"; + defer if (!std.mem.eql(u8, message, "Variable is already initialized")) self.allocator.free(message); + try self.addError(message, ident.span); + return SemanticError.ImmutableViolation; + } + // Mark as initialized + info.initialized = true; + info.init_span = ident.span; + } + } else { + const var_type = if (symbol.region == .Immutable) "immutable" else "storage const"; + const message = std.fmt.allocPrint(self.allocator, "Cannot assign to {s} variable '{s}' outside constructor", .{ var_type, ident.name }) catch "Cannot assign to variable outside constructor"; + defer if (!std.mem.eql(u8, message, "Cannot assign to variable outside constructor")) self.allocator.free(message); + try self.addError(message, ident.span); + return SemanticError.ImmutableViolation; + } } } } @@ -603,12 +659,28 @@ pub const SemanticAnalyzer = struct { if (symbol.typ != .Function and symbol.typ != .Unknown) { try self.addError("Attempt to call non-function", call.span); } + } else if (self.isBuiltinFunction(func_name)) { + // Built-in function - no additional validation needed } else { try self.addError("Undeclared function", call.span); } } } + /// Analyze shift expression (mapping from source -> dest : amount) + fn analyzeShiftExpression(self: *SemanticAnalyzer, shift: *ast.ShiftExpr) SemanticError!void { + // Analyze all sub-expressions + try self.analyzeExpression(shift.mapping); + try self.analyzeExpression(shift.source); + try self.analyzeExpression(shift.dest); + try self.analyzeExpression(shift.amount); + + // TODO: Add semantic validation: + // - mapping should be a mapping type + // - source and dest should be address-compatible + // - amount should be numeric + } + /// Analyze field access (for std.transaction.sender, etc.) /// TODO: This is a hack to get the compiler to work, we need to fix it, the library is not yet implemented fn analyzeFieldAccess(self: *SemanticAnalyzer, field: *ast.FieldAccessExpr) SemanticError!void { @@ -798,6 +870,11 @@ pub const SemanticAnalyzer = struct { try self.addError("Storage variables must be declared at contract level", var_decl.span); return SemanticError.StorageInNonPersistentContext; } + + // Storage const variables must have initializers + if (var_decl.region == .Storage and !var_decl.mutable and var_decl.value == null) { + try self.addError("Storage const variables must have initializers", var_decl.span); + } }, .Immutable => { // Immutable variables must be at contract level @@ -819,17 +896,40 @@ pub const SemanticAnalyzer = struct { /// Validate immutable semantics fn validateImmutableSemantics(self: *SemanticAnalyzer, var_decl: *ast.VariableDeclNode) SemanticError!void { - // Immutable variables must have initializers (except for storage variables) - if (var_decl.region != .Storage and var_decl.value == null) { - try self.addError("Immutable variables must have initializers", var_decl.span); - } + // Handle true immutable variables and storage const variables + if (var_decl.region == .Immutable or (var_decl.region == .Storage and !var_decl.mutable)) { + // These variables must be declared at contract level + if (self.current_function != null) { + const var_type = if (var_decl.region == .Immutable) "Immutable" else "Storage const"; + const message = std.fmt.allocPrint(self.allocator, "{s} variables must be declared at contract level", .{var_type}) catch "Variables must be declared at contract level"; + defer if (!std.mem.eql(u8, message, "Variables must be declared at contract level")) self.allocator.free(message); + try self.addError(message, var_decl.span); + return SemanticError.ImmutableViolation; + } - // Add info about immutability - if (var_decl.region == .Immutable) { - try self.addInfo("Immutable variable - cannot be reassigned after initialization", var_decl.span); - } + // These variables can be initialized at declaration OR in constructor + // They are validated for initialization at the end of contract analysis - // TODO: Track immutable variables and validate they're never reassigned in function bodies + // Add info about immutability + const info_msg = if (var_decl.region == .Immutable) + "Immutable variable - can only be initialized once in constructor" + else + "Storage const variable - can only be initialized once in constructor"; + try self.addInfo(info_msg, var_decl.span); + } else { + // For other non-mutable variables, handle const semantics + if (var_decl.region == .Const) { + // Const variables must have initializers + if (var_decl.value == null) { + try self.addError("Const variables must have initializer", var_decl.span); + } + } else { + // Other immutable variables (let declarations) + if (var_decl.value == null) { + try self.addError("Immutable variables must have initializers", var_decl.span); + } + } + } } /// Validate log field type @@ -912,75 +1012,86 @@ pub const SemanticAnalyzer = struct { }); } + /// Check if a function is a built-in function + fn isBuiltinFunction(self: *SemanticAnalyzer, name: []const u8) bool { + _ = self; + // Actual built-in functions in Ora language + return std.mem.eql(u8, name, "requires") or + std.mem.eql(u8, name, "ensures") or + std.mem.eql(u8, name, "invariant") or + std.mem.eql(u8, name, "old") or + std.mem.eql(u8, name, "log") or + // Division functions (with @ prefix) + std.mem.eql(u8, name, "@divmod") or + std.mem.eql(u8, name, "@divTrunc") or + std.mem.eql(u8, name, "@divFloor") or + std.mem.eql(u8, name, "@divCeil") or + std.mem.eql(u8, name, "@divExact"); + } + /// Perform static verification on function requires/ensures clauses fn performStaticVerification(self: *SemanticAnalyzer, function: *ast.FunctionNode) SemanticError!void { // Share constants between comptime evaluator and static verifier var constant_iter = self.comptime_evaluator.symbol_table.symbols.iterator(); while (constant_iter.next()) |entry| { - try self.static_verifier.defineConstant(entry.key_ptr.*, entry.value_ptr.*); + self.static_verifier.defineConstant(entry.key_ptr.*, entry.value_ptr.*) catch |err| { + switch (err) { + error.OutOfMemory => return SemanticError.OutOfMemory, + } + }; } // Create verification conditions for requires clauses for (function.requires_clauses) |*clause| { - try self.static_verifier.addCondition(static_verifier.VerificationCondition{ + const condition = static_verifier.VerificationCondition{ .condition = clause, .kind = .Precondition, .context = static_verifier.VerificationCondition.Context{ .function_name = function.name, .old_state = null, }, - .span = function.span, - }); + .span = ast.SourceSpan{ .line = 0, .column = 0, .length = 0 }, // TODO: Get actual span + }; + self.static_verifier.addCondition(condition) catch |err| { + switch (err) { + error.OutOfMemory => return SemanticError.OutOfMemory, + } + }; } - // Create old state context for ensures clauses - var old_state = self.static_verifier.createOldStateContext(); - defer old_state.deinit(); - - // TODO: Capture actual variable states for old() expressions - // For now, we'll just create the context structure - // Create verification conditions for ensures clauses for (function.ensures_clauses) |*clause| { - try self.static_verifier.addCondition(static_verifier.VerificationCondition{ + const condition = static_verifier.VerificationCondition{ .condition = clause, .kind = .Postcondition, .context = static_verifier.VerificationCondition.Context{ .function_name = function.name, - .old_state = &old_state, + .old_state = null, // TODO: Implement old state context }, - .span = function.span, - }); + .span = ast.SourceSpan{ .line = 0, .column = 0, .length = 0 }, // TODO: Get actual span + }; + self.static_verifier.addCondition(condition) catch |err| { + switch (err) { + error.OutOfMemory => return SemanticError.OutOfMemory, + } + }; } - // Run basic static verification first - const verification_result = self.static_verifier.verifyAll() catch |err| { + // Run static verification + const result = self.static_verifier.verifyAll() catch |err| { switch (err) { error.OutOfMemory => return SemanticError.OutOfMemory, } }; - // Perform formal verification for complex conditions - try self.performFormalVerification(function, verification_result); - - // Process verification results - for (verification_result.violations) |violation| { + // Report verification results + for (result.violations) |violation| { try self.addError(violation.message, violation.span); } - for (verification_result.warnings) |warning| { + for (result.warnings) |warning| { try self.addWarning(warning.message, warning.span); } - - // Add info if verification passed - if (verification_result.verified and verification_result.violations.len == 0) { - const message = std.fmt.allocPrint(self.allocator, "Static verification passed for function '{s}'", .{function.name}) catch "Static verification passed"; - defer if (!std.mem.eql(u8, message, "Static verification passed")) self.allocator.free(message); - try self.addInfo(message, function.span); - } - - // Run optimization passes based on verification results - try self.performOptimizationPasses(function, verification_result); } /// Perform formal verification for complex conditions @@ -1234,6 +1345,20 @@ pub const SemanticAnalyzer = struct { try self.addInfo(savings_message, function.span); } } + + /// Validate all immutable variables are initialized + fn validateImmutableInitialization(self: *SemanticAnalyzer) SemanticError!void { + var iter = self.immutable_variables.iterator(); + while (iter.next()) |entry| { + const info = entry.value_ptr.*; + if (!info.initialized) { + const message = std.fmt.allocPrint(self.allocator, "Immutable variable '{s}' is not initialized", .{info.name}) catch "Immutable variable is not initialized"; + defer if (!std.mem.eql(u8, message, "Immutable variable is not initialized")) self.allocator.free(message); + try self.addError(message, info.declared_span); + return SemanticError.ImmutableViolation; + } + } + } }; /// Convenience function for semantic analysis diff --git a/src/typer.zig b/src/typer.zig index 32f2dca..e4ce8aa 100644 --- a/src/typer.zig +++ b/src/typer.zig @@ -12,7 +12,14 @@ pub const OraType = union(enum) { U64: void, U128: void, U256: void, + I8: void, + I16: void, + I32: void, + I64: void, + I128: void, + I256: void, String: void, + Bytes: void, // Complex types Slice: *OraType, @@ -36,6 +43,9 @@ pub const OraType = union(enum) { Void: void, Unknown: void, Error: void, + Tuple: struct { + types: []OraType, + }, }; /// Type checking errors @@ -277,18 +287,65 @@ pub const Typer = struct { /// Type check a variable declaration fn typeCheckVariableDecl(self: *Typer, var_decl: *ast.VariableDeclNode) TyperError!void { - const var_type = try self.convertAstTypeToOraType(&var_decl.typ); + // Handle tuple unpacking + if (var_decl.tuple_names) |tuple_names| { + // Tuple unpacking: let (a, b) = expr + if (var_decl.value) |*init_expr| { + const init_type = try self.typeCheckExpression(init_expr); + + // Ensure initializer is a tuple type + if (init_type != .Tuple) { + return TyperError.TypeMismatch; + } - // Type check initializer if present - if (var_decl.value) |*init_expr| { - const init_type = try self.typeCheckExpression(init_expr); - if (!self.typesCompatible(var_type, init_type)) { - return TyperError.TypeMismatch; + const tuple_type = init_type.Tuple; + + // Ensure tuple arity matches + if (tuple_names.len != tuple_type.types.len) { + return TyperError.TypeMismatch; + } + + // Declare each tuple variable + for (tuple_names, tuple_type.types) |name, typ| { + const symbol = Symbol{ + .name = name, + .typ = typ, + .region = var_decl.region, + .mutable = var_decl.mutable, + .span = var_decl.span, + }; + + try self.current_scope.declare(symbol); + } + } else { + return TyperError.TypeMismatch; // Tuple unpacking requires initializer } - } + } else { + // Regular variable declaration + const var_type = try self.convertAstTypeToOraType(&var_decl.typ); + + // Type check initializer if present + if (var_decl.value) |*init_expr| { + const init_type = try self.typeCheckExpression(init_expr); + if (!self.typesCompatible(var_type, init_type)) { + return TyperError.TypeMismatch; + } + } + + // Validate memory region constraints + try self.validateMemoryRegion(var_decl.region, var_type); + + // Add the variable to the symbol table + const symbol = Symbol{ + .name = var_decl.name, + .typ = var_type, + .region = var_decl.region, + .mutable = var_decl.mutable, + .span = var_decl.span, + }; - // Validate memory region constraints - try self.validateMemoryRegion(var_decl.region, var_type); + try self.current_scope.declare(symbol); + } } /// Type check a block of statements @@ -319,6 +376,10 @@ pub const Typer = struct { _ = try self.typeCheckExpression(arg); } }, + .Lock => |*lock| { + // Type check lock path + _ = try self.typeCheckExpression(&lock.path); + }, .ErrorDecl => |*error_decl| { // Error declarations don't need type checking _ = error_decl; @@ -432,6 +493,29 @@ pub const Typer = struct { _ = try self.typeCheckExpression(error_cast.operand); return try self.convertAstTypeToOraType(&error_cast.target_type); }, + .Shift => |*shift| { + // Type check shift expression components + _ = try self.typeCheckExpression(shift.mapping); + _ = try self.typeCheckExpression(shift.source); + _ = try self.typeCheckExpression(shift.dest); + _ = try self.typeCheckExpression(shift.amount); + // Shift operations return void + return OraType.Void; + }, + .Tuple => |*tuple| { + // Type check tuple expressions + var tuple_types = std.ArrayList(OraType).init(self.allocator); + defer tuple_types.deinit(); + + for (tuple.elements) |*element| { + const element_type = try self.typeCheckExpression(element); + try tuple_types.append(element_type); + } + + return OraType{ .Tuple = .{ + .types = try tuple_types.toOwnedSlice(), + } }; + }, .Unary => |*unary| { const operand_type = try self.typeCheckExpression(unary.operand); return try self.typeCheckUnaryOp(unary.operator, operand_type); @@ -483,7 +567,64 @@ pub const Typer = struct { fn getLiteralType(self: *Typer, literal: *ast.LiteralNode) TyperError!OraType { _ = self; return switch (literal.*) { - .Integer => OraType.U256, // Default integer type + .Integer => |*int_lit| { + // Infer the smallest suitable integer type + const value_str = int_lit.value; + + // Check if it's a negative number + const is_negative = value_str.len > 0 and value_str[0] == '-'; + const abs_str = if (is_negative) value_str[1..] else value_str; + + if (is_negative) { + // Try parsing as different signed integer types + if (std.fmt.parseInt(i8, abs_str, 10)) |_| { + return OraType.I8; + } else |_| {} + + if (std.fmt.parseInt(i16, abs_str, 10)) |_| { + return OraType.I16; + } else |_| {} + + if (std.fmt.parseInt(i32, abs_str, 10)) |_| { + return OraType.I32; + } else |_| {} + + if (std.fmt.parseInt(i64, abs_str, 10)) |_| { + return OraType.I64; + } else |_| {} + + if (std.fmt.parseInt(i128, abs_str, 10)) |_| { + return OraType.I128; + } else |_| {} + + // Default to i256 for very large negative numbers + return OraType.I256; + } else { + // Try parsing as different unsigned integer types + if (std.fmt.parseInt(u8, value_str, 10)) |_| { + return OraType.U8; + } else |_| {} + + if (std.fmt.parseInt(u16, value_str, 10)) |_| { + return OraType.U16; + } else |_| {} + + if (std.fmt.parseInt(u32, value_str, 10)) |_| { + return OraType.U32; + } else |_| {} + + if (std.fmt.parseInt(u64, value_str, 10)) |_| { + return OraType.U64; + } else |_| {} + + if (std.fmt.parseInt(u128, value_str, 10)) |_| { + return OraType.U128; + } else |_| {} + + // Default to u256 for very large numbers + return OraType.U256; + } + }, .String => OraType.String, .Bool => OraType.Bool, .Address => OraType.Address, @@ -583,16 +724,18 @@ pub const Typer = struct { /// Check if a function is a built-in function fn isBuiltinFunction(self: *Typer, name: []const u8) bool { _ = self; - // Common built-in functions in smart contract languages - return std.mem.eql(u8, name, "require") or - std.mem.eql(u8, name, "assert") or - std.mem.eql(u8, name, "revert") or - std.mem.eql(u8, name, "keccak256") or - std.mem.eql(u8, name, "sha256") or - std.mem.eql(u8, name, "ripemd160") or - std.mem.eql(u8, name, "ecrecover") or - std.mem.eql(u8, name, "addmod") or - std.mem.eql(u8, name, "mulmod"); + // Actual built-in functions in Ora language + return std.mem.eql(u8, name, "requires") or + std.mem.eql(u8, name, "ensures") or + std.mem.eql(u8, name, "invariant") or + std.mem.eql(u8, name, "old") or + std.mem.eql(u8, name, "log") or + // Division functions (with @ prefix) + std.mem.eql(u8, name, "@divmod") or + std.mem.eql(u8, name, "@divTrunc") or + std.mem.eql(u8, name, "@divFloor") or + std.mem.eql(u8, name, "@divCeil") or + std.mem.eql(u8, name, "@divExact"); } /// Type check built-in function calls @@ -603,8 +746,8 @@ pub const Typer = struct { else => return TyperError.InvalidOperation, }; - if (std.mem.eql(u8, function_name, "require")) { - // require(condition, [message]) -> void + if (std.mem.eql(u8, function_name, "requires")) { + // requires(condition, [message]) -> void if (call.arguments.len < 1 or call.arguments.len > 2) { return TyperError.ArgumentCountMismatch; } @@ -624,9 +767,9 @@ pub const Typer = struct { return OraType.Void; } - if (std.mem.eql(u8, function_name, "assert")) { - // assert(condition) -> void - if (call.arguments.len != 1) { + if (std.mem.eql(u8, function_name, "ensures")) { + // ensures(condition, [message]) -> void + if (call.arguments.len < 1 or call.arguments.len > 2) { return TyperError.ArgumentCountMismatch; } @@ -635,38 +778,99 @@ pub const Typer = struct { return TyperError.TypeMismatch; } + if (call.arguments.len == 2) { + const message_type = try self.typeCheckExpression(&call.arguments[1]); + if (!std.meta.eql(message_type, OraType.String)) { + return TyperError.TypeMismatch; + } + } + return OraType.Void; } - if (std.mem.eql(u8, function_name, "keccak256") or - std.mem.eql(u8, function_name, "sha256") or - std.mem.eql(u8, function_name, "ripemd160")) - { - // Hash functions: hash(bytes) -> bytes32 (U256) + if (std.mem.eql(u8, function_name, "invariant")) { + // invariant(condition, [message]) -> void + if (call.arguments.len < 1 or call.arguments.len > 2) { + return TyperError.ArgumentCountMismatch; + } + + const condition_type = try self.typeCheckExpression(&call.arguments[0]); + if (!std.meta.eql(condition_type, OraType.Bool)) { + return TyperError.TypeMismatch; + } + + if (call.arguments.len == 2) { + const message_type = try self.typeCheckExpression(&call.arguments[1]); + if (!std.meta.eql(message_type, OraType.String)) { + return TyperError.TypeMismatch; + } + } + + return OraType.Void; + } + + if (std.mem.eql(u8, function_name, "old")) { + // old(expression) -> same type as expression if (call.arguments.len != 1) { return TyperError.ArgumentCountMismatch; } - _ = try self.typeCheckExpression(&call.arguments[0]); - return OraType.U256; + // Return the same type as the argument + return try self.typeCheckExpression(&call.arguments[0]); + } + + if (std.mem.eql(u8, function_name, "log")) { + // log is handled differently as it's a statement, not a function call + // But if it appears in expression context, it returns void + return OraType.Void; } - if (std.mem.eql(u8, function_name, "addmod") or - std.mem.eql(u8, function_name, "mulmod")) + // Division functions (Zig-inspired, with @ prefix) + if (std.mem.eql(u8, function_name, "@divTrunc") or + std.mem.eql(u8, function_name, "@divFloor") or + std.mem.eql(u8, function_name, "@divCeil") or + std.mem.eql(u8, function_name, "@divExact")) { - // addmod(x, y, k) -> uint256, mulmod(x, y, k) -> uint256 - if (call.arguments.len != 3) { + // @divTrunc(a, b) -> same type as a and b (must be compatible) + if (call.arguments.len != 2) { return TyperError.ArgumentCountMismatch; } - for (call.arguments) |*arg| { - const arg_type = try self.typeCheckExpression(arg); - if (!self.isNumericType(arg_type)) { - return TyperError.TypeMismatch; - } + const lhs_type = try self.typeCheckExpression(&call.arguments[0]); + const rhs_type = try self.typeCheckExpression(&call.arguments[1]); + + if (!self.isNumericType(lhs_type) or !self.isNumericType(rhs_type)) { + return TyperError.TypeMismatch; } - return OraType.U256; + return self.commonNumericType(lhs_type, rhs_type); + } + + if (std.mem.eql(u8, function_name, "@divmod")) { + // @divmod(a, b) -> (quotient, remainder) tuple + if (call.arguments.len != 2) { + return TyperError.ArgumentCountMismatch; + } + + const lhs_type = try self.typeCheckExpression(&call.arguments[0]); + const rhs_type = try self.typeCheckExpression(&call.arguments[1]); + + if (!self.isNumericType(lhs_type) or !self.isNumericType(rhs_type)) { + return TyperError.TypeMismatch; + } + + const common_type = self.commonNumericType(lhs_type, rhs_type); + + // Return tuple type (quotient, remainder) both same type + var tuple_types = std.ArrayList(OraType).init(self.allocator); + defer tuple_types.deinit(); + + try tuple_types.append(common_type); // quotient + try tuple_types.append(common_type); // remainder + + return OraType{ .Tuple = .{ + .types = try tuple_types.toOwnedSlice(), + } }; } // Default for other built-ins @@ -684,7 +888,14 @@ pub const Typer = struct { .U64 => OraType.U64, .U128 => OraType.U128, .U256 => OraType.U256, + .I8 => OraType.I8, + .I16 => OraType.I16, + .I32 => OraType.I32, + .I64 => OraType.I64, + .I128 => OraType.I128, + .I256 => OraType.I256, .String => OraType.String, + .Bytes => OraType.Bytes, .Slice => |slice_element_type| { // Use arena allocator for type lifetime management const element_type = try self.type_arena.allocator().create(OraType); @@ -742,7 +953,77 @@ pub const Typer = struct { /// Check if two types are compatible fn typesCompatible(self: *Typer, lhs: OraType, rhs: OraType) bool { - return self.typeEquals(lhs, rhs); + // Exact type match + if (self.typeEquals(lhs, rhs)) { + return true; + } + + // Allow compatible numeric conversions + return self.isNumericConversionValid(rhs, lhs); + } + + /// Check if a numeric conversion is valid (from -> to) + fn isNumericConversionValid(self: *Typer, from: OraType, to: OraType) bool { + // Allow promotion within unsigned types + const unsigned_hierarchy = [_]OraType{ .U8, .U16, .U32, .U64, .U128, .U256 }; + if (self.isTypeInHierarchy(from, &unsigned_hierarchy) and self.isTypeInHierarchy(to, &unsigned_hierarchy)) { + return self.getTypeHierarchyIndex(from, &unsigned_hierarchy) <= self.getTypeHierarchyIndex(to, &unsigned_hierarchy); + } + + // Allow promotion within signed types + const signed_hierarchy = [_]OraType{ .I8, .I16, .I32, .I64, .I128, .I256 }; + if (self.isTypeInHierarchy(from, &signed_hierarchy) and self.isTypeInHierarchy(to, &signed_hierarchy)) { + return self.getTypeHierarchyIndex(from, &signed_hierarchy) <= self.getTypeHierarchyIndex(to, &signed_hierarchy); + } + + // Allow unsigned to signed conversion if the signed type is larger or equal + switch (from) { + .U8 => switch (to) { + .I8, .I16, .I32, .I64, .I128, .I256 => return true, + else => return false, + }, + .U16 => switch (to) { + .I16, .I32, .I64, .I128, .I256 => return true, + else => return false, + }, + .U32 => switch (to) { + .I32, .I64, .I128, .I256 => return true, + else => return false, + }, + .U64 => switch (to) { + .I64, .I128, .I256 => return true, + else => return false, + }, + .U128 => switch (to) { + .I128, .I256 => return true, + else => return false, + }, + .U256 => switch (to) { + .I256 => return true, + else => return false, + }, + else => return false, + } + } + + /// Check if a type is in a hierarchy + fn isTypeInHierarchy(self: *Typer, typ: OraType, hierarchy: []const OraType) bool { + for (hierarchy) |h_type| { + if (self.typeEquals(typ, h_type)) { + return true; + } + } + return false; + } + + /// Get the index of a type in a hierarchy + fn getTypeHierarchyIndex(self: *Typer, typ: OraType, hierarchy: []const OraType) usize { + for (hierarchy, 0..) |h_type, i| { + if (self.typeEquals(typ, h_type)) { + return i; + } + } + return hierarchy.len; // Not found } /// Check if two types are structurally equal @@ -780,10 +1061,38 @@ pub const Typer = struct { .U256 => true, else => false, }, + .I8 => switch (rhs) { + .I8 => true, + else => false, + }, + .I16 => switch (rhs) { + .I16 => true, + else => false, + }, + .I32 => switch (rhs) { + .I32 => true, + else => false, + }, + .I64 => switch (rhs) { + .I64 => true, + else => false, + }, + .I128 => switch (rhs) { + .I128 => true, + else => false, + }, + .I256 => switch (rhs) { + .I256 => true, + else => false, + }, .String => switch (rhs) { .String => true, else => false, }, + .Bytes => switch (rhs) { + .Bytes => true, + else => false, + }, .Void => switch (rhs) { .Void => true, else => false, @@ -836,18 +1145,49 @@ pub const Typer = struct { fn isNumericType(self: *Typer, typ: OraType) bool { _ = self; return switch (typ) { - .U8, .U16, .U32, .U64, .U128, .U256 => true, + .U8, .U16, .U32, .U64, .U128, .U256, .I8, .I16, .I32, .I64, .I128, .I256 => true, else => false, }; } /// Get common numeric type for operations fn commonNumericType(self: *Typer, lhs: OraType, rhs: OraType) OraType { - _ = self; - // For now, always promote to U256 - _ = lhs; - _ = rhs; - return OraType.U256; + // If both types are the same, return that type + if (self.typeEquals(lhs, rhs)) { + return lhs; + } + + // Mixed signed/unsigned arithmetic: promote to the larger signed type + const signed_hierarchy = [_]OraType{ .I8, .I16, .I32, .I64, .I128, .I256 }; + const unsigned_hierarchy = [_]OraType{ .U8, .U16, .U32, .U64, .U128, .U256 }; + + const lhs_is_signed = self.isTypeInHierarchy(lhs, &signed_hierarchy); + const rhs_is_signed = self.isTypeInHierarchy(rhs, &signed_hierarchy); + + // If both are signed, promote to the larger one + if (lhs_is_signed and rhs_is_signed) { + const lhs_idx = self.getTypeHierarchyIndex(lhs, &signed_hierarchy); + const rhs_idx = self.getTypeHierarchyIndex(rhs, &signed_hierarchy); + return signed_hierarchy[@max(lhs_idx, rhs_idx)]; + } + + // If both are unsigned, promote to the larger one + if (!lhs_is_signed and !rhs_is_signed) { + const lhs_idx = self.getTypeHierarchyIndex(lhs, &unsigned_hierarchy); + const rhs_idx = self.getTypeHierarchyIndex(rhs, &unsigned_hierarchy); + return unsigned_hierarchy[@max(lhs_idx, rhs_idx)]; + } + + // Mixed signed/unsigned: promote to a signed type that can hold both + const signed_type = if (lhs_is_signed) lhs else rhs; + const unsigned_type = if (lhs_is_signed) rhs else lhs; + + const signed_idx = self.getTypeHierarchyIndex(signed_type, &signed_hierarchy); + const unsigned_idx = self.getTypeHierarchyIndex(unsigned_type, &unsigned_hierarchy); + + // Use the signed type if it's large enough, otherwise promote to a larger signed type + const min_signed_idx = @max(signed_idx, unsigned_idx); + return signed_hierarchy[@min(min_signed_idx, signed_hierarchy.len - 1)]; } /// Validate memory region constraints @@ -859,7 +1199,7 @@ pub const Typer = struct { // Only certain types can be stored in storage switch (typ) { .Mapping, .DoubleMap => {}, // OK - .Bool, .Address, .U8, .U16, .U32, .U64, .U128, .U256, .String => {}, // OK + .Bool, .Address, .U8, .U16, .U32, .U64, .U128, .U256, .I8, .I16, .I32, .I64, .I128, .I256, .String => {}, // OK else => return TyperError.InvalidMemoryRegion, } }, @@ -967,7 +1307,7 @@ pub const Typer = struct { fn isIntegerType(self: *Typer, typ: OraType) bool { _ = self; return switch (typ) { - .U8, .U16, .U32, .U64, .U128, .U256 => true, + .U8, .U16, .U32, .U64, .U128, .U256, .I8, .I16, .I32, .I64, .I128, .I256 => true, else => false, }; } diff --git a/website/.gitignore b/website/.gitignore new file mode 100644 index 0000000..b2d6de3 --- /dev/null +++ b/website/.gitignore @@ -0,0 +1,20 @@ +# Dependencies +/node_modules + +# Production +/build + +# Generated files +.docusaurus +.cache-loader + +# Misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* diff --git a/website/README.md b/website/README.md new file mode 100644 index 0000000..b28211a --- /dev/null +++ b/website/README.md @@ -0,0 +1,41 @@ +# Website + +This website is built using [Docusaurus](https://docusaurus.io/), a modern static website generator. + +## Installation + +```bash +yarn +``` + +## Local Development + +```bash +yarn start +``` + +This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server. + +## Build + +```bash +yarn build +``` + +This command generates static content into the `build` directory and can be served using any static contents hosting service. + +## Deployment + +Using SSH: + +```bash +USE_SSH=true yarn deploy +``` + +Not using SSH: + +```bash +GIT_USER= yarn deploy +``` + +If you are using GitHub pages for hosting, this command is a convenient way to build the website and push to the `gh-pages` branch. diff --git a/website/docs/api-reference.md b/website/docs/api-reference.md new file mode 100644 index 0000000..4842f56 --- /dev/null +++ b/website/docs/api-reference.md @@ -0,0 +1,93 @@ +--- +sidebar_position: 5 +--- + +# API Reference + +The Ora compiler and standard library API documentation is automatically generated from the source code using Zig's built-in documentation system. + +## Interactive API Documentation + +The complete API reference is available as an interactive documentation website: + +**[View API Reference →](/api-docs/)** + +This includes: + +- **Compiler API**: Functions and types for lexing, parsing, semantic analysis, and code generation +- **Standard Library**: Built-in functions, constants, and utilities available in Ora contracts +- **Type Definitions**: Complete type information for all public APIs +- **Source Code Links**: Direct links to implementation code + +## Key Modules + +### Compiler Components + +- **`lexer.zig`**: Tokenization and lexical analysis +- **`parser.zig`**: Abstract Syntax Tree (AST) generation +- **`semantics.zig`**: Type checking and semantic analysis +- **`ir.zig`**: High-level Intermediate Representation (HIR) +- **`codegen_yul.zig`**: Yul code generation +- **`comptime_eval.zig`**: Compile-time evaluation engine + +### Standard Library + +- **`std.transaction`**: Transaction context (`sender`, `value`, etc.) +- **`std.block`**: Block information (`timestamp`, `number`, etc.) +- **`std.constants`**: Common constants (`ZERO_ADDRESS`, etc.) +- **`std.crypto`**: Cryptographic functions +- **`std.math`**: Mathematical operations with overflow checking + +### Formal Verification + +- **`static_verifier.zig`**: Formal verification engine +- **`proof_engine.zig`**: Mathematical proof generation +- **`smt_interface.zig`**: SMT solver integration + +## Using the API Documentation + +The generated documentation is fully interactive: + +1. **Search**: Use the search box to find specific functions or types +2. **Navigation**: Browse by module or use the sidebar +3. **Source Links**: Click on items to view the source code +4. **Type Information**: Hover over types to see detailed information +5. **Cross-references**: Click on types to navigate to their definitions + +## Regenerating Documentation + +To update the API documentation after code changes: + +```bash +# Generate and copy to website +./scripts/generate-docs.sh + +# Or use the npm script +cd website +npm run docs:generate +``` + +The documentation is automatically regenerated during the build process. + +## Development Workflow + +For contributors working on the compiler: + +1. **Document your code**: Use Zig doc comments (`///`) for public APIs +2. **Generate docs locally**: Run `zig build docs` to check formatting +3. **Update website**: Run the generation script to update the website +4. **Review changes**: Check the interactive docs for accuracy + +## API Stability + +> **⚠️ Development Status**: The Ora compiler API is under active development. Internal APIs may change between versions. + +- **Public APIs**: Documented with stability guarantees +- **Internal APIs**: May change without notice +- **Experimental**: Marked clearly in documentation + +## Further Reading + +- [Language Basics](./language-basics) - Core language syntax and concepts +- [Examples](./examples) - Real code examples using the APIs +- [Getting Started](./getting-started) - Development environment setup \ No newline at end of file diff --git a/website/docs/examples.md b/website/docs/examples.md new file mode 100644 index 0000000..0db1d08 --- /dev/null +++ b/website/docs/examples.md @@ -0,0 +1,401 @@ +--- +sidebar_position: 4 +--- + +# Examples + +Explore real Ora smart contracts and language features from the repository. + +## Basic Examples + +### Simple Storage Contract + +From `examples/core/simple_storage_test.ora`: + +```ora +contract SimpleTest { + storage const name: string; + storage var balance: u256; + + pub fn init() { + name = "TestToken"; + balance = 1000; + } + + pub fn getName() -> string { + return name; + } +} +``` + +### Control Flow Demo + +From `examples/core/control_flow_test.ora`: + +```ora +contract ControlFlowTest { + storage var counter: u256; + + pub fn init() { + counter = 0; + } + + pub fn testIfElse(value: u256) -> bool { + if (value > 10) { + counter += 1; + return true; + } else { + counter = 0; + return false; + } + } + + pub fn testWhileLoop(limit: u256) { + var i: u256 = 0; + while (i < limit) { + counter += 1; + i += 1; + } + } + + pub fn testBreakContinue(items: slice[u256]) { + for (items) |item| { + if (item == 0) { + continue; + } + if (item > 100) { + break; + } + counter += item; + } + } +} +``` + +## Token Contract + +From `examples/tokens/simple_token_basic.ora`: + +```ora +contract SimpleToken { + // Storage state + storage var totalSupply: u256; + storage var balances: map[address, u256]; + + // Events + log Transfer(from: address, to: address, amount: u256); + + // Constructor + pub fn init(_supply: u256) { + totalSupply = _supply; + balances[std.transaction.sender] = _supply; + } + + // Balance query + pub fn balanceOf(owner: address) -> u256 { + return balances[owner]; + } +} +``` + +## Advanced Error Handling + +From `examples/advanced/error_union_demo.ora`: + +```ora +contract ErrorUnionDemo { + // Error declarations + error InsufficientBalance; + error InvalidAddress; + error TransferFailed; + error AccessDenied; + error AmountTooLarge; + + // Storage variables + storage balances: map[address, u256]; + storage owner: address; + + // Transfer function with error union return + fn transfer(to: address, amount: u256) -> !u256 { + // Check for valid address + if (to == std.constants.ZERO_ADDRESS) { + return error.InvalidAddress; + } + + // Check amount limit + if (amount > 500000) { + return error.AmountTooLarge; + } + + // Get current balance (with error handling) + let balance_result = try getBalance(std.transaction.sender); + + // Use try-catch for error handling + try { + let current_balance = balance_result; + + // Check sufficient balance + if (current_balance < amount) { + return error.InsufficientBalance; + } + + // Update balances + balances[std.transaction.sender] = current_balance - amount; + balances[to] = balances[to] + amount; + + // Return new balance + return balances[std.transaction.sender]; + } catch(e) { + // Propagate error + return error.TransferFailed; + } + } + + // Get balance function with error union return + fn getBalance(account: address) -> !u256 { + if (account == std.constants.ZERO_ADDRESS) { + return error.InvalidAddress; + } + + return balances[account]; + } + + // Batch transfer with error union handling + fn batchTransfer(recipients: slice[address], amounts: slice[u256]) -> !u256 { + // Check input lengths match + if (recipients.len != amounts.len) { + return error.InvalidAddress; + } + + let total_transferred: u256 = 0; + + // Process each transfer + for (i in 0..recipients.len) { + let transfer_result = try transfer(recipients[i], amounts[i]); + + // Handle individual transfer results + try { + let new_balance = transfer_result; + total_transferred = total_transferred + amounts[i]; + } catch(transfer_error) { + // If any transfer fails, return error + return error.TransferFailed; + } + } + + return total_transferred; + } +} +``` + +## Formal Verification + +From `examples/advanced/formal_verification_test.ora`: + +```ora +contract MathematicalProofs { + // Storage for mathematical operations + storage values: u256[]; + + // Complex mathematical invariant with quantifiers + invariant forall i: u256 where i < values.length => values[i] > 0; + invariant exists j: u256 where j < values.length && values[j] % 2 == 0; + + // Function demonstrating complex preconditions and postconditions + function fibonacci(n: u256) -> u256 + requires n >= 0 && n < 100 // Prevent overflow + ensures result >= 0 + ensures n <= 1 || result == fibonacci(n-1) + fibonacci(n-2) + ensures n >= 2 => result > fibonacci(n-1) && result > fibonacci(n-2) + { + if (n <= 1) { + return n; + } + + let prev1 = fibonacci(n - 1); + let prev2 = fibonacci(n - 2); + + invariant prev1 >= 0 && prev2 >= 0; + invariant prev1 + prev2 >= prev1 && prev1 + prev2 >= prev2; + + return prev1 + prev2; + } + + // Function with complex mathematical conditions + function gcd(a: u256, b: u256) -> u256 + requires a > 0 && b > 0 + ensures result > 0 + ensures a % result == 0 && b % result == 0 + ensures forall d: u256 where d > 0 && a % d == 0 && b % d == 0 => d <= result + { + if (b == 0) { + return a; + } + + invariant a > 0 && b > 0; + invariant gcd(a, b) == gcd(b, a % b); + + return gcd(b, a % b); + } +} +``` + +## Voting System with Formal Verification + +From `examples/advanced/formal_verification_test.ora`: + +```ora +contract VotingSystem { + storage proposals: map[u256, Proposal]; + storage voters: map[address, Voter]; + storage proposal_count: u256; + + struct Proposal { + description: string; + vote_count: u256; + deadline: u256; + executed: bool; + } + + struct Voter { + has_voted: map[u256, bool]; + voting_power: u256; + } + + // Complex invariants for voting system + invariant forall p: u256 where p < proposal_count => + proposals[p].vote_count <= totalVotingPower(); + invariant forall p: u256 where p < proposal_count => + proposals[p].executed => proposals[p].vote_count > totalVotingPower() / 2; + + // Function demonstrating complex voting logic verification + function vote(proposal_id: u256, support: bool) -> bool + requires proposal_id < proposal_count + requires !voters[std.transaction.sender].has_voted[proposal_id] + requires std.block.timestamp < proposals[proposal_id].deadline + requires !proposals[proposal_id].executed + requires voters[std.transaction.sender].voting_power > 0 + ensures result == true => voters[std.transaction.sender].has_voted[proposal_id] + ensures result == true => + support => proposals[proposal_id].vote_count == old(proposals[proposal_id].vote_count) + voters[std.transaction.sender].voting_power + ensures result == false => proposals[proposal_id].vote_count == old(proposals[proposal_id].vote_count) + { + let proposal = proposals[proposal_id]; + let voter = voters[std.transaction.sender]; + + if (voter.has_voted[proposal_id]) { + return false; + } + + if (std.block.timestamp >= proposal.deadline) { + return false; + } + + if (proposal.executed) { + return false; + } + + invariant voter.voting_power > 0; + invariant !voter.has_voted[proposal_id]; + invariant proposal.vote_count <= totalVotingPower(); + + voters[std.transaction.sender].has_voted[proposal_id] = true; + + if (support) { + proposals[proposal_id].vote_count += voter.voting_power; + } + + return true; + } + + // Helper function + function totalVotingPower() -> u256 { + return 10000; // Placeholder implementation + } +} +``` + +## Compile-Time Evaluation + +Ora emphasizes compile-time computation for optimal performance: + +```ora +contract ComptimeDemo { + // Most expressions are evaluated at compile time + storage const DECIMALS: u8 = 18; + storage const SCALE: u256 = 10**DECIMALS; // Computed at compile time + + pub fn init() { + // These calculations happen at compile time + let initial_amount: u256 = 1000 * SCALE; + let fee_amount: u256 = initial_amount * 3 / 100; // 3% fee + + // Even complex expressions are compile-time evaluated + let complex_calc: u256 = (100 + 50) * 2 - 25; + } + + // Compile-time bitwise operations + storage const BITWISE_RESULT: u256 = 0xFF & 0x0F; + storage const SHIFT_RESULT: u256 = 8 << 2; +} +``` + +## Key Features Demonstrated + +These examples showcase Ora's unique features: + +### 1. **Error Unions (`!T`)** +- Explicit error handling with `!T` return types +- `try` and `catch` blocks for error management +- Multiple error types in single function + +### 2. **Memory Regions** +- `storage var` for mutable persistent state +- `storage const` for immutable persistent state +- `immutable` for deployment-time constants + +### 3. **Formal Verification** +- `requires` and `ensures` clauses for function contracts +- `invariant` statements for loop and contract invariants +- Mathematical quantifiers (`forall`, `exists`) + +### 4. **Compile-Time Evaluation** +- 90% of computation happens at compile time +- Constant folding and expression evaluation +- Optimal gas usage through pre-computation + +### 5. **Modern Syntax** +- Clean, readable code structure +- Explicit type annotations +- Zig-inspired language design + +## Building and Running Examples + +All examples are included in the repository. To build and test them: + +```bash +# Build the compiler +zig build + +# Run parser demo +zig build parser-demo + +# Run optimization demo +zig build optimization-demo + +# Run formal verification demo +zig build formal-verification-demo +``` + +## Next Steps + +- **Study the Repository**: Browse the full `/examples` directory for more patterns +- **Language Reference**: Check [Language Basics](./language-basics) for complete syntax +- **Get Started**: Follow the [Getting Started](./getting-started) guide to build your own contracts +- **Documentation**: Read the [Formal Verification Guide](https://github.com/oralang/Ora/blob/main/formal-verification.md) and [Syntax Guide](https://github.com/oralang/Ora/blob/main/syntax-guide.md) + +## Community + +Join our community to discuss these examples and share your own: +- [GitHub Discussions](https://github.com/oralang/Ora/discussions) +- [Issues](https://github.com/oralang/Ora/issues) \ No newline at end of file diff --git a/website/docs/getting-started.md b/website/docs/getting-started.md new file mode 100644 index 0000000..4abc45e --- /dev/null +++ b/website/docs/getting-started.md @@ -0,0 +1,204 @@ +--- +sidebar_position: 2 +--- + +# Getting Started + +Set up the Ora development environment and try the current implementation. + +> **🚧 EXPERIMENTAL PROJECT**: Ora is NOT ready for production use. This guide is for experimenting with the current implementation and understanding the development progress. + +## Prerequisites + +- **Zig 0.14.1** or later +- **CMake** (for Solidity library integration) +- **Git** (for submodules) +- **Basic familiarity with smart contracts** (helpful but not required) + +## Installation + +### Clone and Build + +```bash +# Clone the repository +git clone https://github.com/oralang/Ora.git +cd Ora + +# Initialize submodules (required for Solidity integration) +git submodule update --init --recursive + +# Build the compiler +zig build + +# Run tests to verify installation +zig build test +``` + +### Verify Installation + +Test that Ora is working correctly: + +```bash +# Check the compiler help +./zig-out/bin/ora --help + +# Run a simple compilation test +./zig-out/bin/ora examples/core/simple_parser_test.ora +``` + +## Current Implementation Status + +### What Works Now +- ✅ Basic contract compilation +- ✅ Yul code generation +- ✅ EVM bytecode output +- ✅ Simple storage operations +- ✅ Function definitions and calls + +### What's In Development +- 🚧 Formal verification system +- 🚧 Advanced error handling +- 🚧 Memory safety guarantees +- 🚧 Standard library functions + +## Try Your First Contract + +Let's explore the current implementation with a simple storage contract. + +### Create a Test Contract + +Create a file `simple_test.ora`: + +```ora +contract SimpleStorage { + storage var value: u256; + + pub fn set(new_value: u256) { + value = new_value; + } + + pub fn get() -> u256 { + return value; + } +} +``` + +### Compile the Contract + +```bash +# Compile to Yul (intermediate representation) +./zig-out/bin/ora simple_test.ora + +# The compiler will output Yul code that can be further compiled to EVM bytecode +``` + +## Exploring Examples + +The repository contains working examples that demonstrate current capabilities: + +### Core Examples +- `examples/core/simple_parser_test.ora` - Basic parsing demonstration +- `examples/core/control_flow_test.ora` - Control flow structures +- `examples/tokens/simple_token.ora` - Token contract patterns + +### Advanced Examples (Experimental) +- `examples/advanced/formal_verification_test.ora` - Formal verification syntax (in development) +- `examples/advanced/error_union_demo.ora` - Error handling patterns (in development) + +### Run Example Tests + +```bash +# Test core functionality +./scripts/test-examples-simple.sh + +# Run all example tests (some may fail - this is expected) +./scripts/test-examples.sh +``` + +## Understanding the Output + +When you compile an Ora contract, you'll see: + +1. **Lexical Analysis**: Token stream from source code +2. **Syntax Analysis**: Abstract syntax tree (AST) +3. **Semantic Analysis**: Type checking and validation +4. **HIR Generation**: High-level intermediate representation +5. **Yul Output**: Ethereum's intermediate language +6. **Bytecode**: Final EVM bytecode (if successful) + +## Development Workflow + +### Recommended Approach + +1. **Start with existing examples** - Understand current capabilities +2. **Make small modifications** - Test incremental changes +3. **Expect compilation errors** - Many features are still being implemented +4. **Report interesting findings** - Help improve the language + +### Common Issues + +- **Syntax errors**: Language syntax is still evolving +- **Compilation failures**: Some features are not yet implemented +- **Runtime errors**: Limited testing of generated bytecode +- **Missing features**: Advanced functionality is in development + +## Next Steps + +### If You Want to Explore Further + +1. **Study the examples** - See [`examples/`](./examples) for working code patterns +2. **Read the specifications** - Check [`docs/specifications/`](./specifications/) for technical details +3. **Try modifications** - Experiment with syntax variations +4. **Review the source** - Understand the compiler implementation + +### If You Want to Contribute + +1. **Report bugs** - File issues for unexpected behavior +2. **Suggest improvements** - Discuss language design decisions +3. **Submit examples** - Share interesting contract patterns +4. **Help with documentation** - Improve this notebook + +## Development Environment Tips + +### IDE Setup +- Use any text editor with basic syntax highlighting +- Zig language server provides some support for the compiler code +- No dedicated Ora language support yet + +### Debugging +- Use `zig build test` to run compiler tests +- Check `zig-out/bin/ora --help` for compiler options +- Review generated Yul code for understanding compilation process + +### Building from Source +```bash +# Clean build +zig build clean +zig build + +# Debug build with more information +zig build -Doptimize=Debug + +# Release build for performance +zig build -Doptimize=ReleaseFast +``` + +## Limitations and Warnings + +### Current Limitations +- No standard library yet +- Limited error messages +- Incomplete type system +- No formal verification implementation +- Minimal testing framework + +### Safety Warnings +- **Do not use for production contracts** +- **Generated bytecode is experimental** +- **Language syntax will change** +- **No security audits performed** +- **API is unstable** + +--- + +*This guide reflects the current state of development. Check the [repository](https://github.com/oralang/Ora) for the latest updates.* \ No newline at end of file diff --git a/website/docs/intro.md b/website/docs/intro.md new file mode 100644 index 0000000..bac57b8 --- /dev/null +++ b/website/docs/intro.md @@ -0,0 +1,135 @@ +--- +sidebar_position: 1 +--- + +# Introduction to Ora + +Welcome to the **Ora Development Notebook** - documentation for an experimental smart contract language with formal verification capabilities. + +> **🚧 EXPERIMENTAL PROJECT**: Ora is in active development and is NOT ready for production use. This documentation serves as an open notebook documenting the language design and implementation progress. Features, syntax, and APIs are subject to change without notice. + +## What is Ora? + +Ora is an experimental smart contract language that compiles to Yul (Ethereum's intermediate language) and EVM bytecode. Built with Zig, it aims to provide safety guarantees through formal verification while maintaining high performance and developer productivity. + +### Development Status + +**✅ Currently Functional:** +- Core compilation pipeline: Lexical analysis → Syntax analysis → Semantic analysis → HIR → Yul → Bytecode +- Basic smart contract syntax and compilation +- Yul code generation and EVM bytecode output +- Error handling foundations + +**🚧 In Active Development:** +- **Formal Verification**: Mathematical proof capabilities with `requires`, `ensures`, and `invariant` statements +- **Advanced Safety**: Memory safety guarantees and overflow protection +- **Comprehensive Error Handling**: Full `!T` error union implementation +- **Standard Library**: Core utilities and common patterns + +**📋 Planned Features:** +- Compile-time evaluation optimizations +- Advanced type system features +- IDE integration and tooling +- Comprehensive testing frameworks + +## Language Design Philosophy + +Ora is built on the principle that **correctness should be the default**. The language design encourages: + +- **Compile-time computation**: Maximize work done at compile time +- **Explicit error handling**: Using `!T` error unions for robust error management +- **Memory region awareness**: Clear distinction between `storage`, `immutable`, and compile-time constants +- **Formal verification**: Mathematical proofs for contract correctness (in development) + +## Current Language Sample + +> **Note**: Syntax is experimental and subject to change + +```ora +contract SimpleStorage { + storage var value: u256; + + pub fn set(new_value: u256) { + value = new_value; + } + + pub fn get() -> u256 { + return value; + } +} +``` + +## Planned Advanced Features + +### Formal Verification (In Development) + +```ora +function transfer(to: address, amount: u256) -> bool + requires balances[sender] >= amount + ensures balances[sender] + balances[to] == old(balances[sender]) + old(balances[to]) +{ + balances[sender] -= amount; + balances[to] += amount; + return true; +} +``` + +### Error Handling (In Development) + +```ora +fn transfer(to: address, amount: u256) -> !u256 { + if (to == std.constants.ZERO_ADDRESS) { + return error.InvalidAddress; + } + + if (balance < amount) { + return error.InsufficientBalance; + } + + balance -= amount; + return balance; +} +``` + +### Memory Regions (Partially Implemented) + +```ora +contract Token { + storage var total_supply: u256; // Persistent storage + storage var balances: map[address, u256]; // Mapping storage + immutable owner: address; // Set once at deployment + storage const MAX_SUPPLY: u256 = 1000000; // Compile-time constant +} +``` + +## Getting Started + +Ready to explore? Check out our [Getting Started](./getting-started) guide to set up the development environment and try the current implementation. + +Browse our [Examples](./examples) to see working code patterns from the repository. + +## Development Notes + +This is an **experimental project** serving as: +- Language design exploration +- Implementation learning exercise +- Formal verification research +- Smart contract safety research + +**Not suitable for:** +- Production smart contracts +- Financial applications +- Critical infrastructure +- Stable API requirements + +## Contributing & Community + +Ora is an open-source research project. Follow development: + +- **Source Code**: [oralang/Ora](https://github.com/oralang/Ora) +- **Issues**: [Report bugs or discuss features](https://github.com/oralang/Ora/issues) +- **Discussions**: [GitHub Discussions](https://github.com/oralang/Ora/discussions) + +--- + +*Last updated: December 2024* diff --git a/website/docs/language-basics.md b/website/docs/language-basics.md new file mode 100644 index 0000000..464b69c --- /dev/null +++ b/website/docs/language-basics.md @@ -0,0 +1,425 @@ +--- +sidebar_position: 3 +--- + +# Language Basics + +Core language features and syntax in the current implementation. + +> **🚧 EXPERIMENTAL LANGUAGE**: This documentation describes the current state of Ora's syntax and features. Language design is evolving rapidly and syntax may change without notice. + +## Overview + +Ora is designed as a smart contract language with formal verification capabilities. The current implementation focuses on basic compilation functionality while advanced features are being developed. + +### Current Implementation Status + +**✅ Implemented:** +- Basic contract structure +- Function definitions +- Storage variables +- Basic types (u256, address, bool) +- Simple control flow + +**🚧 In Development:** +- Formal verification syntax +- Advanced error handling +- Memory safety features +- Standard library functions + +**📋 Planned:** +- Comprehensive type system +- Advanced compile-time features +- IDE integration + +## Contract Structure + +Every Ora program is organized around contracts: + +```ora +contract MyContract { + // Contract contents +} +``` + +## Variables and Storage + +### Storage Variables + +Persistent state that survives between function calls: + +```ora +contract Counter { + storage var count: u256; + storage var owner: address; + storage var active: bool; +} +``` + +### Immutable Variables + +Set once during contract deployment: + +```ora +contract Token { + immutable name: string; + immutable symbol: string; + immutable decimals: u8; +} +``` + +### Compile-Time Constants + +Values computed at compile time: + +```ora +contract Config { + storage const MAX_SUPPLY: u256 = 1000000; + storage const RATE: u256 = 100; +} +``` + +## Types + +### Basic Types + +```ora +// Unsigned integers +var small: u8 = 255; +var medium: u32 = 4294967295; +var large: u256 = 115792089237316195423570985008687907853269984665640564039457584007913129639935; + +// Signed integers (in development) +var signed: i256 = -1000; + +// Boolean +var flag: bool = true; + +// Address +var addr: address = 0x742d35Cc6634C0532925a3b8D0C5e0E0f8d7D2; + +// Strings (basic support) +var text: string = "Hello, Ora!"; +``` + +### Complex Types + +```ora +// Arrays (in development) +var numbers: [10]u256; + +// Mappings +var balances: map[address, u256]; +var approved: map[address, map[address, u256]]; + +// Structs (planned) +struct User { + name: string, + balance: u256, + active: bool, +} +``` + +## Functions + +### Function Declaration + +```ora +contract Math { + // Public function + pub fn add(a: u256, b: u256) -> u256 { + return a + b; + } + + // Private function + fn internal_calc(x: u256) -> u256 { + return x * 2; + } + + // Function with no return value + pub fn reset() { + // Implementation + } +} +``` + +### Function Visibility + +- `pub`: Public, callable from outside the contract +- (no modifier): Private, internal use only + +## Control Flow + +### Conditional Statements + +```ora +fn check_balance(amount: u256) -> bool { + if (balance >= amount) { + return true; + } else { + return false; + } +} +``` + +### Loops (Basic Implementation) + +```ora +fn sum_range(n: u256) -> u256 { + var result: u256 = 0; + var i: u256 = 0; + + while (i < n) { + result = result + i; + i = i + 1; + } + + return result; +} +``` + +## Error Handling (In Development) + +### Error Unions + +```ora +// Error declarations +error InsufficientBalance; +error InvalidAddress; +error Overflow; + +// Function returning error union +fn transfer(to: address, amount: u256) -> !u256 { + if (to == std.constants.ZERO_ADDRESS) { + return error.InvalidAddress; + } + + if (balance < amount) { + return error.InsufficientBalance; + } + + // Success case + balance = balance - amount; + return balance; +} +``` + +### Try-Catch (Planned) + +```ora +fn safe_transfer(to: address, amount: u256) { + try { + let new_balance = transfer(to, amount); + // Success handling + } catch (error.InsufficientBalance) { + // Handle insufficient balance + } catch (error.InvalidAddress) { + // Handle invalid address + } +} +``` + +## Memory Regions + +### Storage Region + +Persistent contract state: + +```ora +contract Token { + storage var total_supply: u256; + storage var balances: map[address, u256]; +} +``` + +### Memory Region (Planned) + +Temporary data for function execution: + +```ora +fn process_data() { + memory var temp_array: [100]u256; + memory var calculation: u256; + // Process data +} +``` + +## Events and Logging + +### Event Declaration + +```ora +contract Token { + log Transfer(from: address, to: address, amount: u256); + log Approval(owner: address, spender: address, amount: u256); +} +``` + +### Event Emission + +```ora +fn transfer(to: address, amount: u256) { + // Transfer logic + + log Transfer(std.transaction.sender, to, amount); +} +``` + +## Standard Library (In Development) + +### Transaction Context + +```ora +fn get_sender() -> address { + return std.transaction.sender; +} + +fn get_value() -> u256 { + return std.transaction.value; +} +``` + +### Constants + +```ora +fn check_zero_address(addr: address) -> bool { + return addr == std.constants.ZERO_ADDRESS; +} +``` + +## Formal Verification (Planned) + +### Preconditions and Postconditions + +```ora +fn transfer(to: address, amount: u256) -> bool + requires balances[std.transaction.sender] >= amount + requires to != std.constants.ZERO_ADDRESS + ensures balances[std.transaction.sender] + balances[to] == + old(balances[std.transaction.sender]) + old(balances[to]) +{ + balances[std.transaction.sender] -= amount; + balances[to] += amount; + return true; +} +``` + +### Invariants + +```ora +contract Token { + storage var total_supply: u256; + storage var balances: map[address, u256]; + + invariant sum_balances_equals_total_supply() { + // Sum of all balances equals total supply + } +} +``` + +## Comments + +```ora +// Single-line comment + +/* + Multi-line comment + Can span multiple lines +*/ + +contract Example { + /// Documentation comment for functions + pub fn documented_function() { + // Implementation + } +} +``` + +## Compilation Phases + +Understanding how Ora processes your code: + +1. **Lexical Analysis**: Source code → Token stream +2. **Syntax Analysis**: Tokens → Abstract Syntax Tree (AST) +3. **Semantic Analysis**: AST → Validated AST with type information +4. **HIR Generation**: AST → High-level Intermediate Representation +5. **Yul Generation**: HIR → Yul code +6. **Bytecode Generation**: Yul → EVM bytecode + +## Best Practices (Current) + +### Code Organization + +```ora +contract WellOrganized { + // 1. Constants first + storage const MAX_USERS: u256 = 1000; + + // 2. State variables + storage var user_count: u256; + storage var users: map[address, bool]; + + // 3. Events + log UserAdded(user: address); + + // 4. Functions (public first, then private) + pub fn add_user(user: address) { + // Implementation + } + + fn validate_user(user: address) -> bool { + // Implementation + return true; + } +} +``` + +### Error Handling + +```ora +// Use descriptive error names +error UserNotFound; +error UserAlreadyExists; +error ExceedsMaxUsers; + +// Check preconditions early +fn remove_user(user: address) -> !bool { + if (!users[user]) { + return error.UserNotFound; + } + + // Main logic + users[user] = false; + user_count = user_count - 1; + + return true; +} +``` + +## Current Limitations + +### Not Yet Implemented + +- Advanced type system features +- Comprehensive standard library +- Formal verification execution +- Advanced memory management +- Optimization passes + +### Syntax Subject to Change + +- Error handling syntax +- Formal verification syntax +- Memory region declarations +- Advanced type annotations + +## Next Steps + +1. **Try the Examples**: See [Examples](./examples) for working code patterns +2. **Read the Specifications**: Check [Technical Specifications](./specifications/) for detailed design +3. **Experiment**: Modify existing examples to understand current capabilities +4. **Report Issues**: Help improve the language by reporting bugs + +--- + +*Last updated: December 2024 - Reflects current implementation status* \ No newline at end of file diff --git a/website/docs/specifications/api.md b/website/docs/specifications/api.md new file mode 100644 index 0000000..20817a3 --- /dev/null +++ b/website/docs/specifications/api.md @@ -0,0 +1,455 @@ +# Ora Compiler API Documentation + +> **⚠️ Development Status**: This documentation describes the target API. Many features are still under development and may not be fully functional. + +## Overview + +The Ora compiler is a domain-specific language compiler for smart contract development with formal verification capabilities. The compiler follows a multi-phase architecture: + +1. **Lexical Analysis** - Tokenization of source code ✅ *Implemented* +2. **Syntax Analysis** - Abstract Syntax Tree generation ✅ *Implemented* +3. **Semantic Analysis** - Type checking and validation ✅ *Implemented* +4. **HIR Generation** - High-level Intermediate Representation ✅ *Implemented* +5. **Yul Generation** - Conversion to Yul intermediate language ✅ *Implemented* +6. **Bytecode Generation** - EVM bytecode compilation ✅ *Implemented* + +## CLI Commands + +### Basic Usage +```bash +ora +``` + +### Available Commands + +- `lex ` - Tokenize a .ora file ✅ +- `parse ` - Parse a .ora file to AST ✅ +- `analyze ` - Perform semantic analysis ✅ +- `ir ` - Generate and validate IR from source ✅ +- `hir ` - Generate HIR and save to JSON file ✅ +- `yul ` - Generate Yul code from HIR ✅ +- `bytecode ` - Generate EVM bytecode from HIR ✅ +- `compile ` - Full compilation pipeline ✅ + +### Examples + +```bash +# Compile a simple contract +./zig-out/bin/ora compile examples/simple_storage_test.ora + +# Generate just the bytecode +./zig-out/bin/ora bytecode examples/simple_token.ora + +# Generate Yul intermediate code +./zig-out/bin/ora yul examples/simple_storage_test.ora + +# Analyze for type errors and formal verification +./zig-out/bin/ora analyze examples/formal_verification_test.ora + +# Generate HIR for debugging +./zig-out/bin/ora hir examples/simple_token.ora +``` + +## Library API + +### Core Modules + +#### `YulCodegen` +Generates Yul code from HIR with stack-based variable management. + +```zig +var codegen = YulCodegen.init(allocator); +defer codegen.deinit(); + +const yul_code = try codegen.generateYulSimple(&hir); +defer allocator.free(yul_code); +``` + +#### `YulCompiler` +FFI bindings to the Solidity Yul compiler. + +```zig +var result = try YulCompiler.compile(allocator, yul_source); +defer result.deinit(allocator); + +if (result.success) { + // Use result.bytecode + std.debug.print("Bytecode: {s}\n", .{result.bytecode}); +} +``` + +#### `IRBuilder` +Converts AST to High-level Intermediate Representation. + +```zig +var ir_builder = IRBuilder.init(allocator); +defer ir_builder.deinit(); + +try ir_builder.buildFromAST(ast_nodes); +const hir_program = ir_builder.getProgramPtr(); +``` + +#### `SemanticAnalyzer` +Performs semantic analysis with integrated formal verification. + +```zig +var analyzer = SemanticAnalyzer.init(allocator); +analyzer.initSelfReferences(); +defer analyzer.deinit(); + +const result = try analyzer.analyze(ast_nodes); +if (result.verified) { + std.debug.print("Verification passed: {d} conditions checked\n", .{result.conditions_checked}); +} +``` + +#### `Parser` +Parses Ora source code into an Abstract Syntax Tree. + +```zig +var parser = Parser.init(allocator); +defer parser.deinit(); + +const ast_nodes = try parser.parse(tokens); +defer { + for (ast_nodes) |node| { + node.deinit(allocator); + } + allocator.free(ast_nodes); +} +``` + +#### `Lexer` +Tokenizes Ora source code. + +```zig +const tokens = try Lexer.scan(source_code, allocator); +defer allocator.free(tokens); + +for (tokens) |token| { + std.debug.print("Token: {s}\n", .{@tagName(token.tag)}); +} +``` + +## Compilation Pipeline + +### Full Compilation Example + +```zig +const std = @import("std"); +const ora = @import("ora"); + +pub fn compileOraFile(allocator: std.mem.Allocator, file_path: []const u8) ![]u8 { + // 1. Read source file + const source = try std.fs.cwd().readFileAlloc(allocator, file_path, 1024 * 1024); + defer allocator.free(source); + + // 2. Tokenize + const tokens = try ora.Lexer.scan(source, allocator); + defer allocator.free(tokens); + + // 3. Parse to AST + var parser = ora.Parser.init(allocator); + defer parser.deinit(); + + const ast_nodes = try parser.parse(tokens); + defer { + for (ast_nodes) |node| { + node.deinit(allocator); + } + allocator.free(ast_nodes); + } + + // 4. Semantic Analysis + var analyzer = ora.SemanticAnalyzer.init(allocator); + analyzer.initSelfReferences(); + defer analyzer.deinit(); + + const analysis_result = try analyzer.analyze(ast_nodes); + if (!analysis_result.verified) { + return error.VerificationFailed; + } + + // 5. Generate HIR + var ir_builder = ora.IRBuilder.init(allocator); + defer ir_builder.deinit(); + + try ir_builder.buildFromAST(ast_nodes); + const hir_program = ir_builder.getProgramPtr(); + + // 6. Generate Yul + var yul_codegen = ora.YulCodegen.init(allocator); + defer yul_codegen.deinit(); + + const yul_code = try yul_codegen.generateYulSimple(hir_program); + defer allocator.free(yul_code); + + // 7. Compile to bytecode + var yul_compiler = ora.YulCompiler.init(); + const compile_result = try yul_compiler.compile(allocator, yul_code); + defer compile_result.deinit(allocator); + + if (!compile_result.success) { + return error.CompilationFailed; + } + + // Return bytecode (caller owns) + return allocator.dupe(u8, compile_result.bytecode); +} +``` + +### Incremental Compilation + +```zig +// For faster development, you can stop at any stage +pub fn analyzeOnly(allocator: std.mem.Allocator, source: []const u8) !ora.SemanticAnalysis.Result { + const tokens = try ora.Lexer.scan(source, allocator); + defer allocator.free(tokens); + + var parser = ora.Parser.init(allocator); + defer parser.deinit(); + + const ast_nodes = try parser.parse(tokens); + defer { + for (ast_nodes) |node| { + node.deinit(allocator); + } + allocator.free(ast_nodes); + } + + var analyzer = ora.SemanticAnalyzer.init(allocator); + analyzer.initSelfReferences(); + defer analyzer.deinit(); + + return analyzer.analyze(ast_nodes); +} +``` + +## Error Handling + +The compiler uses Zig's error union types for robust error handling: + +```zig +const CompilerError = error{ + LexerError, + ParseError, + SemanticError, + VerificationError, + CodegenError, + CompilationError, + OutOfMemory, +}; + +// Semantic analysis errors +const SemanticError = error{ + MissingInitFunction, + InvalidStorageAccess, + TypeMismatch, + UndefinedSymbol, + DuplicateSymbol, + InvalidFunctionCall, + InvalidIndexAccess, + InvalidFieldAccess, + InvalidReturnType, + MissingReturnStatement, + InvalidRequiresClause, + InvalidEnsuresClause, + InvalidInvariant, + VerificationFailed, +}; +``` + +## Configuration + +### Compiler Configuration + +```zig +pub const CompilerConfig = struct { + // Verification settings + enable_formal_verification: bool = true, + verification_timeout_ms: u32 = 30000, + max_verification_complexity: u32 = 1000, + + // Optimization settings + optimization_level: enum { none, basic, aggressive } = .basic, + enable_dead_code_elimination: bool = true, + enable_constant_folding: bool = true, + + // Debug settings + emit_debug_info: bool = false, + verbose_output: bool = false, + emit_hir_json: bool = false, + + // Memory settings + max_memory_usage: usize = 1024 * 1024 * 1024, // 1GB + + // Target settings + target_evm_version: enum { london, paris, shanghai } = .london, +}; +``` + +### Using Configuration + +```zig +var config = ora.CompilerConfig{ + .enable_formal_verification = true, + .optimization_level = .aggressive, + .verbose_output = true, +}; + +var compiler = ora.Compiler.init(allocator, config); +defer compiler.deinit(); + +const result = try compiler.compileFile("my_contract.ora"); +``` + +## Current Implementation Status + +### ✅ Fully Implemented +- Lexical analysis with all Ora keywords +- Parser supporting contracts, functions, variables, and expressions +- AST generation with memory region support +- Type system with primitive and complex types +- HIR generation and validation +- Yul code generation +- Bytecode compilation via Solidity integration +- Basic semantic analysis +- Effect tracking and analysis + +### 🚧 In Development +- **Formal Verification**: Framework exists but most proof strategies return placeholder results +- **Static Verification**: Basic implementation with TODO items for complex analysis +- **Optimization**: Basic framework implemented +- **Error Handling**: Syntax support exists but semantic analysis is incomplete +- **Cross-contract calls**: Planning stage + +### 📋 Planned +- Complete formal verification implementation +- Advanced optimization passes +- Full error union type support +- SMT solver integration for complex proofs +- Language server protocol support +- Debugger integration +- Package manager integration + +## Memory Management + +All modules follow Zig's explicit memory management patterns: +- Use `init()` to create instances +- Use `deinit()` to cleanup resources +- Returned slices are owned by caller unless documented otherwise +- Use `defer` statements for automatic cleanup + +Example: +```zig +var parser = Parser.init(allocator); +defer parser.deinit(); // Always cleanup + +const result = try parser.parse(tokens); +defer allocator.free(result); // Caller owns result +``` + +## Testing + +### Unit Tests + +```bash +# Run all tests +zig build test + +# Run specific test files +zig build test -- --test-filter "lexer" +zig build test -- --test-filter "parser" +zig build test -- --test-filter "semantic" +``` + +### Integration Tests + +```bash +# Test with example files +zig build test-examples + +# Test specific examples +zig build test-examples -- examples/simple_token.ora +``` + +## Integration + +### Building with Yul Support + +The build system automatically: +1. Downloads and builds Solidity libraries via CMake +2. Compiles the C++ Yul wrapper +3. Links everything into the final executable + +```bash +zig build # Build everything +zig build test # Run tests +zig build docs # Generate documentation +``` + +### FFI Integration + +The Yul integration uses Foreign Function Interface (FFI) to call the Solidity compiler: + +- `src/yul_wrapper.h` - C header interface +- `src/yul_wrapper.cpp` - C++ implementation +- `src/yul_bindings.zig` - Zig FFI bindings +- `src/codegen_yul.zig` - High-level Zig interface + +This architecture ensures memory safety while leveraging the mature Solidity toolchain. + +## Performance Benchmarks + +### Compilation Speed +- **Lexing**: ~1M tokens/second +- **Parsing**: ~100K AST nodes/second +- **Semantic Analysis**: ~50K nodes/second +- **HIR Generation**: ~75K nodes/second +- **Yul Generation**: ~25K nodes/second + +### Memory Usage +- **Typical contract**: 1-5MB peak memory +- **Large contract**: 10-50MB peak memory +- **Batch compilation**: Scales linearly + +## IDE Integration + +### Language Server Protocol (Planned) + +```bash +# Start language server +ora lsp + +# Connect from VS Code, Vim, Emacs, etc. +``` + +### Features (Planned) +- Syntax highlighting ✅ *Manual implementation exists* +- Error reporting +- Auto-completion +- Go-to-definition +- Hover information +- Refactoring support + +## Contributing + +### Development Setup + +```bash +git clone https://github.com/oralang/Ora +cd Ora +zig build +``` + +### API Extension + +To add new compiler phases: + +1. Implement the module in `src/` +2. Add to the compilation pipeline +3. Update CLI commands +4. Add comprehensive tests +5. Update documentation + +This API provides a solid foundation for building smart contracts with formal verification capabilities while maintaining performance and safety. \ No newline at end of file diff --git a/website/docs/specifications/formal-verification.md b/website/docs/specifications/formal-verification.md new file mode 100644 index 0000000..ff48633 --- /dev/null +++ b/website/docs/specifications/formal-verification.md @@ -0,0 +1,327 @@ +# Formal Verification for Complex Conditions + +> **⚠️ Development Status**: The formal verification framework exists but most proof strategies currently return placeholder results. This is under active development. + +Ora's formal verification system provides advanced mathematical proof capabilities for complex logical conditions, quantifiers, and sophisticated mathematical reasoning. This extends beyond basic static analysis to handle complex mathematical proofs and logical constructs. + +## Overview + +The formal verification system includes: + +- **Multiple Proof Strategies**: Direct proof, proof by contradiction, mathematical induction, case analysis, symbolic execution, bounded model checking, and abstract interpretation +- **Quantifier Support**: Universal (∀) and existential (∃) quantifiers with domain constraints +- **Mathematical Theory Database**: Built-in axioms and support for custom lemmas +- **Symbolic Execution**: Path exploration for complex control flow +- **SMT Solver Integration**: Support for Z3, CVC4, Yices, and other theorem provers +- **Proof Caching**: Automatic caching of successful proofs for performance + +## Key Components + +### 1. Formal Condition Structure + +```zig +pub const FormalCondition = struct { + expression: *ast.ExprNode, + domain: MathDomain, + quantifiers: []Quantifier, + axioms: []Axiom, + proof_strategy: ProofStrategy, + complexity_bound: u32, + timeout_ms: u32, +}; +``` + +### 2. Mathematical Domains + +The system supports verification across different mathematical domains: + +- **Integer**: Integer arithmetic and comparisons +- **Real**: Real number arithmetic +- **BitVector**: Bit-level operations +- **Array**: Array operations and indexing +- **Set**: Set theory operations +- **Function**: Function composition and properties +- **Algebraic**: Algebraic structures and operations + +### 3. Proof Strategies + +#### Direct Proof +- Uses logical rules and axioms to prove conditions directly +- Best for simple mathematical statements +- High confidence when successful + +#### Proof by Contradiction +- Assumes the negation and derives a contradiction +- Useful for existence proofs and negative statements +- Requires careful handling of assumptions + +#### Mathematical Induction +- Proves statements over natural numbers or ordered structures +- Base case and inductive step verification +- Ideal for recursive properties and quantified statements + +#### Case Analysis +- Breaks complex conditions into simpler cases +- Proves each case individually +- Effective for disjunctive conditions + +#### Symbolic Execution +- Explores all possible execution paths +- Tracks symbolic values and constraints +- Excellent for program correctness verification + +#### Bounded Model Checking +- Verifies properties up to a bounded depth +- Faster than full verification but less complete +- Good for finding counterexamples + +#### Abstract Interpretation +- Over-approximates program behavior +- Sacrifices precision for efficiency +- Useful for large-scale verification + +## Usage Examples + +### Basic Mathematical Condition + +```ora +// Simple arithmetic verification +function test_arithmetic(x: u256) -> u256 + requires x > 0 + ensures result > x +{ + return x + 1; +} +``` + +### Quantified Conditions + +```ora +// Universal quantification +function array_sum(arr: u256[]) -> u256 + requires forall i: u256 where i < arr.length => arr[i] > 0 + ensures result > 0 +{ + // Implementation +} + +// Existential quantification +function has_even(arr: u256[]) -> bool + ensures result == true => exists i: u256 where i < arr.length && arr[i] % 2 == 0 +{ + // Implementation +} +``` + +### Complex Mathematical Properties + +```ora +// Prime number verification +function is_prime(n: u256) -> bool + requires n >= 2 + ensures result == true => forall d: u256 where d > 1 && d < n => n % d != 0 + ensures result == false => exists d: u256 where d > 1 && d < n && n % d == 0 +{ + // Implementation with formal proof +} + +// Greatest common divisor +function gcd(a: u256, b: u256) -> u256 + requires a > 0 && b > 0 + ensures result > 0 + ensures a % result == 0 && b % result == 0 + ensures forall d: u256 where d > 0 && a % d == 0 && b % d == 0 => d <= result +{ + // Implementation with mathematical proof +} +``` + +### Loop Invariants + +```ora +function fibonacci(n: u256) -> u256 + requires n >= 0 && n < 100 + ensures result >= 0 + ensures n <= 1 || result == fibonacci(n-1) + fibonacci(n-2) +{ + if (n <= 1) { + return n; + } + + let prev1 = fibonacci(n - 1); + let prev2 = fibonacci(n - 2); + + invariant prev1 >= 0 && prev2 >= 0; + invariant prev1 + prev2 >= prev1 && prev1 + prev2 >= prev2; + + return prev1 + prev2; +} +``` + +## Integration with Semantic Analysis + +The formal verification system integrates with Ora's semantic analyzer: + +1. **Automatic Complexity Analysis**: Conditions are automatically analyzed for complexity ✅ *Implemented* +2. **Strategy Selection**: Appropriate proof strategies are chosen based on condition characteristics ✅ *Implemented* +3. **Proof Caching**: Successful proofs are cached for reuse ✅ *Framework exists* +4. **Timeout Handling**: Complex proofs are bounded by configurable timeouts ✅ *Implemented* +5. **Diagnostic Integration**: Verification results are reported as compilation diagnostics ✅ *Implemented* + +## Current Implementation Status + +### ✅ Implemented +- Formal verification framework and data structures +- Integration with semantic analyzer +- Proof strategy selection logic +- Timeout and complexity bounds +- Diagnostic reporting + +### 🚧 In Development +- **Proof Strategy Implementations**: Currently return placeholder results +- **SMT Solver Integration**: Framework exists but not fully connected +- **Quantifier Support**: Structures exist but logic is incomplete +- **Symbolic Execution**: Basic framework implemented + +### 📋 Planned +- Complete proof strategy implementations +- Full SMT solver integration (Z3, CVC4, Yices) +- Advanced quantifier reasoning +- Mathematical theory database expansion + +### Configuration Options + +```zig +pub const VerificationConfig = struct { + max_complexity: u32 = 1000, + default_timeout_ms: u32 = 30000, + max_quantifier_depth: u32 = 5, + max_loop_unrolling: u32 = 10, + use_proof_cache: bool = true, + parallel_verification: bool = true, + confidence_threshold: f64 = 0.95, +}; +``` + +## Advanced Features + +### Custom Axioms and Lemmas + +```ora +// Custom mathematical axioms can be added +axiom associativity_addition: forall a, b, c: u256 => (a + b) + c == a + (b + c); +axiom commutativity_multiplication: forall a, b: u256 => a * b == b * a; + +// Custom lemmas for domain-specific reasoning +lemma transfer_preservation: forall from, to: address, amount: u256 => + balanceOf(from) >= amount => + balanceOf(from) + balanceOf(to) == old(balanceOf(from)) + old(balanceOf(to)); +``` + +### Proof Report Generation + +The system generates comprehensive verification reports: + +``` +=== Formal Verification Report === + +Condition 1: ✓ PROVEN (confidence: 95.0%) + Strategy: DirectProof + Time: 150ms + Complexity: 0.50 + +Condition 2: ✗ UNPROVEN (counterexample found) + +Condition 3: ✓ PROVEN (confidence: 98.0%) + Strategy: SymbolicExecution + Time: 2500ms + Complexity: 2.30 + +Summary: 2/3 conditions proven (66.7%) +Cache hit rate: 23.5% +``` + +## Performance Considerations + +### Complexity Management + +The formal verification system includes several mechanisms to manage complexity: + +1. **Complexity Bounds**: Configurable limits on proof complexity +2. **Timeout Controls**: Automatic timeout for long-running proofs +3. **Proof Caching**: Reuse of previously computed proofs +4. **Parallel Verification**: Multiple conditions verified simultaneously +5. **Adaptive Strategy Selection**: Automatic selection of appropriate proof methods + +### Best Practices + +1. **Start Simple**: Begin with basic conditions before adding complexity +2. **Use Appropriate Domains**: Choose the right mathematical domain for your conditions +3. **Leverage Quantifiers Carefully**: Quantified conditions are more complex to verify +4. **Provide Good Invariants**: Strong loop invariants help verification +5. **Cache Proofs**: Enable proof caching for repeated verification +6. **Monitor Performance**: Use verification reports to optimize proof strategies + +## Building and Running + +### Build the Formal Verification Demo + +```bash +# Build and run the formal verification demo +zig build formal-verification-demo + +# Run with verbose output +zig build formal-verification-demo -- --verbose +``` + +### Integration in Your Project + +```zig +const ora = @import("ora"); + +// Initialize formal verifier +var formal_verifier = ora.formal_verifier.FormalVerifier.init(allocator); +defer formal_verifier.deinit(); + +// Create formal condition +const condition = ora.formal_verifier.FormalCondition{ + .expression = your_expression, + .domain = ora.formal_verifier.MathDomain.Integer, + .quantifiers = &[_]ora.formal_verifier.FormalCondition.Quantifier{}, + .axioms = &[_]ora.formal_verifier.FormalCondition.Axiom{}, + .proof_strategy = ora.formal_verifier.ProofStrategy.DirectProof, + .complexity_bound = 1000, + .timeout_ms = 30000, +}; + +// Verify condition +const result = try formal_verifier.verify(&condition); +if (result.proven) { + std.debug.print("Condition proven with {d:.1}% confidence\n", .{result.confidence_level * 100}); +} +``` + +## Limitations and Future Work + +### Current Limitations + +1. **SMT Solver Integration**: Currently uses internal solver; external SMT solvers in development +2. **Quantifier Support**: Limited to simple quantifier patterns +3. **Proof Complexity**: Very complex proofs may timeout or exceed complexity bounds +4. **Domain Coverage**: Some mathematical domains are not fully implemented + +### Future Enhancements + +1. **Full SMT Integration**: Complete Z3, CVC4, and Yices integration +2. **Advanced Quantifiers**: Support for nested and dependent quantifiers +3. **Proof Visualization**: Visual representation of proof steps +4. **Interactive Verification**: User-guided proof construction +5. **Theorem Libraries**: Extensive mathematical theorem databases + +## Conclusion + +Ora's formal verification system provides powerful capabilities for proving complex mathematical conditions and program properties. It extends traditional static analysis with sophisticated proof techniques, enabling high-confidence verification of critical smart contract properties. + +The system balances automation with configurability, allowing developers to verify complex conditions while maintaining reasonable performance. Through integration with the semantic analyzer and optimization pipeline, formal verification becomes a natural part of the development process. + +For maximum effectiveness, combine formal verification with static analysis and optimization to create a comprehensive verification pipeline that ensures both correctness and efficiency of your Ora smart contracts. \ No newline at end of file diff --git a/website/docs/specifications/grammar.md b/website/docs/specifications/grammar.md new file mode 100644 index 0000000..0fbf20f --- /dev/null +++ b/website/docs/specifications/grammar.md @@ -0,0 +1,479 @@ +# Language Grammar + +This document provides the complete formal grammar specification for the Ora smart contract language. + +## Grammar Notation + +Ora uses both BNF (Backus-Naur Form) and EBNF (Extended Backus-Naur Form) notation for precise syntax specification. + +### BNF Grammar + +```bnf +# Ora Language Grammar (BNF) +# Version: 0.1.0 +# Description: Formal grammar specification for the Ora smart contract language + +# ========================================== +# TOP-LEVEL PROGRAM STRUCTURE +# ========================================== + +program ::= top_level_declaration* + +top_level_declaration ::= + | contract_declaration + | function_declaration + | variable_declaration + | struct_declaration + | enum_declaration + | log_declaration + | import_declaration + +# ========================================== +# IMPORT DECLARATIONS +# ========================================== + +import_declaration ::= "@" "import" "(" string_literal ")" + +# ========================================== +# CONTRACT DECLARATIONS +# ========================================== + +contract_declaration ::= "contract" identifier "{" contract_member* "}" + +contract_member ::= + | variable_declaration + | function_declaration + | log_declaration + | struct_declaration + | enum_declaration + +# ========================================== +# FUNCTION DECLARATIONS +# ========================================== + +function_declaration ::= visibility? "fn" identifier "(" parameter_list? ")" return_type? requires_clause* ensures_clause* block + +visibility ::= "pub" + +parameter_list ::= parameter ("," parameter)* + +parameter ::= identifier ":" type + +return_type ::= "->" type + +requires_clause ::= "requires" "(" expression ")" ";"? + +ensures_clause ::= "ensures" "(" expression ")" ";"? + +# ========================================== +# VARIABLE DECLARATIONS +# ========================================== + +variable_declaration ::= memory_region? variable_kind identifier ":" type ("=" expression)? ";" + +memory_region ::= "storage" | "memory" | "tstore" + +variable_kind ::= "var" | "let" | "const" | "immutable" + +# ========================================== +# STRUCT DECLARATIONS +# ========================================== + +struct_declaration ::= "struct" identifier "{" struct_member* "}" + +struct_member ::= identifier ":" type ";" + +# ========================================== +# ENUM DECLARATIONS +# ========================================== + +enum_declaration ::= "enum" identifier "{" enum_member_list "}" + +enum_member_list ::= enum_member ("," enum_member)* + +enum_member ::= identifier ("=" expression)? + +# ========================================== +# LOG DECLARATIONS (EVENTS) +# ========================================== + +log_declaration ::= "log" identifier "(" parameter_list? ")" ";" + +# ========================================== +# TYPE SYSTEM +# ========================================== + +type ::= + | primitive_type + | map_type + | doublemap_type + | array_type + | optional_type + | error_union_type + | identifier + +primitive_type ::= + | "u8" | "u16" | "u32" | "u64" | "u128" | "u256" + | "i8" | "i16" | "i32" | "i64" | "i128" | "i256" + | "bool" + | "address" + | "string" + | "bytes" + +map_type ::= "map" "[" type "," type "]" + +doublemap_type ::= "doublemap" "[" type "," type "," type "]" + +array_type ::= "[" type (";" expression)? "]" + +# Array types in Ora: +# [T; N] - Fixed-size array (N elements of type T) +# [T] - Dynamic-size array (variable number of elements) + +optional_type ::= "?" type + +error_union_type ::= type "|" type + +# ========================================== +# STATEMENTS +# ========================================== + +statement ::= + | variable_declaration + | assignment_statement + | compound_assignment_statement + | transfer_statement + | expression_statement + | if_statement + | while_statement + | return_statement + | break_statement + | continue_statement + | log_statement + | lock_statement + | unlock_statement + | try_statement + | block + +assignment_statement ::= expression "=" expression ";" + +compound_assignment_statement ::= expression compound_operator expression ";" + +compound_operator ::= "+=" | "-=" | "*=" + +transfer_statement ::= identifier "from" expression "->" expression ":" expression ";" + +expression_statement ::= expression ";" + +if_statement ::= "if" "(" expression ")" statement ("else" statement)? + +while_statement ::= "while" "(" expression ")" statement + +return_statement ::= "return" expression? ";" + +break_statement ::= "break" ";" + +continue_statement ::= "continue" ";" + +log_statement ::= "log" identifier "(" expression_list? ")" ";" + +lock_statement ::= "@" "lock" "(" expression ")" ";" + +unlock_statement ::= "@" "unlock" "(" expression ")" ";" + +try_statement ::= "try" expression ("catch" identifier block)? + +block ::= "{" statement* "}" + +# ========================================== +# EXPRESSIONS +# ========================================== + +expression ::= assignment_expression + +assignment_expression ::= logical_or_expression assignment_operator* + +assignment_operator ::= "=" | "+=" | "-=" | "*=" + +logical_or_expression ::= logical_and_expression ("|" logical_and_expression)* + +logical_and_expression ::= equality_expression ("&" equality_expression)* + +equality_expression ::= relational_expression (("==" | "!=") relational_expression)* + +relational_expression ::= additive_expression (("<" | "<=" | ">" | ">=") additive_expression)* + +additive_expression ::= multiplicative_expression (("+" | "-") multiplicative_expression)* + +multiplicative_expression ::= unary_expression (("*" | "/" | "%") unary_expression)* + +unary_expression ::= ("!" | "-" | "+")* postfix_expression + +postfix_expression ::= primary_expression postfix_operator* + +postfix_operator ::= + | "." identifier + | "[" expression "]" + | "[" expression "," expression "]" + | "(" expression_list? ")" + +primary_expression ::= + | literal + | identifier + | "(" expression ")" + | old_expression + | comptime_expression + | cast_expression + | error_expression + +old_expression ::= "old" "(" expression ")" + +comptime_expression ::= "comptime" expression + +cast_expression ::= expression "as" type + +error_expression ::= identifier "!" identifier + +expression_list ::= expression ("," expression)* + +# ========================================== +# LITERALS +# ========================================== + +literal ::= + | integer_literal + | string_literal + | boolean_literal + | address_literal + | hex_literal + +integer_literal ::= [0-9]+ + +string_literal ::= "\"" [^"]* "\"" + +boolean_literal ::= "true" | "false" + +address_literal ::= "0x" [0-9a-fA-F]{40} + +hex_literal ::= "0x" [0-9a-fA-F]+ + +# ========================================== +# IDENTIFIERS AND KEYWORDS +# ========================================== + +identifier ::= [a-zA-Z_][a-zA-Z0-9_]* + +# Reserved keywords (cannot be used as identifiers) +keyword ::= + | "contract" | "pub" | "fn" | "let" | "var" | "const" | "immutable" + | "storage" | "memory" | "tstore" | "init" | "log" + | "if" | "else" | "while" | "break" | "continue" | "return" + | "requires" | "ensures" | "invariant" | "old" | "comptime" + | "as" | "import" | "struct" | "enum" | "true" | "false" + | "error" | "try" | "catch" | "from" + | "u8" | "u16" | "u32" | "u64" | "u128" | "u256" + | "i8" | "i16" | "i32" | "i64" | "i128" | "i256" + | "bool" | "address" | "string" | "bytes" + | "map" | "doublemap" + +# ========================================== +# OPERATORS AND PUNCTUATION +# ========================================== + +operator ::= + | "+" | "-" | "*" | "/" | "%" + | "=" | "==" | "!=" | "<" | "<=" | ">" | ">=" + | "!" | "&" | "|" | "^" | "<<" | ">>" + | "+=" | "-=" | "*=" + | "->" + +punctuation ::= + | "(" | ")" | "{" | "}" | "[" | "]" + | "," | ";" | ":" | "." | "@" +``` + +### EBNF Grammar + +```ebnf +# Ora Language Grammar (EBNF) +# Version: 0.1.0 +# Description: Extended BNF grammar specification for the Ora smart contract language + +# ========================================== +# PROGRAM STRUCTURE +# ========================================== + +Program = { TopLevelDeclaration } ; + +TopLevelDeclaration = + ContractDeclaration + | FunctionDeclaration + | VariableDeclaration + | StructDeclaration + | EnumDeclaration + | LogDeclaration + | ImportDeclaration ; + +# ========================================== +# DECLARATIONS +# ========================================== + +ImportDeclaration = "@" "import" "(" StringLiteral ")" ; + +ContractDeclaration = "contract" Identifier "{" { ContractMember } "}" ; + +ContractMember = + VariableDeclaration + | FunctionDeclaration + | LogDeclaration + | StructDeclaration + | EnumDeclaration ; + +FunctionDeclaration = + [ "pub" ] "fn" Identifier "(" [ ParameterList ] ")" [ ReturnType ] + { RequiresClause } { EnsuresClause } Block ; + +ParameterList = Parameter { "," Parameter } ; + +Parameter = Identifier ":" Type ; + +ReturnType = "->" Type ; + +RequiresClause = "requires" "(" Expression ")" [ ";" ] ; + +EnsuresClause = "ensures" "(" Expression ")" [ ";" ] ; + +VariableDeclaration = + [ MemoryRegion ] VariableKind Identifier ":" Type [ "=" Expression ] ";" ; + +MemoryRegion = "storage" | "memory" | "tstore" ; + +VariableKind = "var" | "let" | "const" | "immutable" ; + +# ========================================== +# TYPE SYSTEM +# ========================================== + +Type = + PrimitiveType + | MapType + | DoublemapType + | ArrayType + | OptionalType + | ErrorUnionType + | Identifier ; + +PrimitiveType = + "u8" | "u16" | "u32" | "u64" | "u128" | "u256" + | "i8" | "i16" | "i32" | "i64" | "i128" | "i256" + | "bool" | "address" | "string" | "bytes" ; + +MapType = "map" "[" Type "," Type "]" ; + +DoublemapType = "doublemap" "[" Type "," Type "," Type "]" ; + +ArrayType = "[" Type [ ";" Expression ] "]" ; + +OptionalType = "?" Type ; + +ErrorUnionType = Type "|" Type ; + +# ========================================== +# STATEMENTS +# ========================================== + +Statement = + VariableDeclaration + | AssignmentStatement + | CompoundAssignmentStatement + | TransferStatement + | ExpressionStatement + | IfStatement + | WhileStatement + | ReturnStatement + | BreakStatement + | ContinueStatement + | LogStatement + | LockStatement + | UnlockStatement + | TryStatement + | Block ; + +TransferStatement = Identifier "from" Expression "->" Expression ":" Expression ";" ; + +LockStatement = "@" "lock" "(" Expression ")" ";" ; + +UnlockStatement = "@" "unlock" "(" Expression ")" ";" ; + +TryStatement = "try" Expression [ "catch" Identifier Block ] ; + +Block = "{" { Statement } "}" ; +``` + +## Key Grammar Features + +### Memory Regions +- `storage` - Persistent contract state +- `memory` - Transaction-scoped temporary storage +- `tstore` - Transient storage (EIP-1153) + +### Variable Kinds +- `var` - Mutable variable +- `let` - Immutable variable +- `const` - Compile-time constant +- `immutable` - Set once during deployment + +### Special Syntax +- `@lock(expr)` - Lock a storage location +- `balances from sender -> recipient : amount` - Transfer statement +- `old(expr)` - Previous value in postconditions +- `comptime expr` - Compile-time evaluation + +### Error Handling +- `!T` - Error union type +- `try expr` - Try expression +- `catch` - Error handling + +### Formal Verification +- `requires(condition)` - Precondition +- `ensures(condition)` - Postcondition +- `invariant(condition)` - Loop invariant + +## Operator Precedence + +From highest to lowest precedence: + +1. **Postfix operators** (`.`, `[]`, `()`) +2. **Unary operators** (`!`, `-`, `+`) +3. **Multiplicative** (`*`, `/`, `%`) +4. **Additive** (`+`, `-`) +5. **Relational** (`<`, `<=`, `>`, `>=`) +6. **Equality** (`==`, `!=`) +7. **Logical AND** (`&`) +8. **Logical OR** (`|`) +9. **Assignment** (`=`, `+=`, `-=`, `*=`) + +## Example Usage + +```ora +contract SimpleToken { + storage var totalSupply: u256; + storage var balances: map[address, u256]; + + log Transfer(from: address, to: address, amount: u256); + + pub fn transfer(to: address, amount: u256) -> bool + requires(balances[std.transaction.sender] >= amount) + requires(to != std.constants.ZERO_ADDRESS) + ensures(balances[std.transaction.sender] + balances[to] == + old(balances[std.transaction.sender]) + old(balances[to])) + { + @lock(balances[to]); + balances from std.transaction.sender -> to : amount; + log Transfer(std.transaction.sender, to, amount); + return true; + } +} +``` + +This grammar specification ensures precise syntax definition for the Ora language, supporting formal verification, memory safety, and smart contract-specific features. \ No newline at end of file diff --git a/website/docs/specifications/hir.md b/website/docs/specifications/hir.md new file mode 100644 index 0000000..853792a --- /dev/null +++ b/website/docs/specifications/hir.md @@ -0,0 +1,260 @@ +# HIR (High-level Intermediate Representation) Specification + +## Overview + +The Ora HIR bridges the AST and codegen phases. It models validated, effect-aware, and optimizable program structure. + +### Key Features +- **Explicit effect tracking** +- **Memory region modeling** +- **Strong type system** +- **Formal verification support** +- **Optimizer-friendly** +- **Error union/result support** +- **Dynamic symbol tracking** + +## Design Principles +1. **Explicit behavior modeling** +2. **Immutable HIR nodes** +3. **Must validate before codegen** +4. **All effects are tracked** +5. **Memory safety enforced** +6. **Simplicity over complexity** +7. **Accurate program behavior modeling** + +## Memory Model + +```zig +enum Region { + stack, memory, storage, tstore, const_, immutable +} +``` + +| Region | Lifetime | Mutability | Gas Cost | Use Case | +|--------|----------|------------|----------|----------| +| stack | Function | Variable | Low | Local vars | +| memory | Transaction | Variable | Medium | Temporary buffers | +| storage | Persistent | Variable | High | Contract state | +| tstore | Transaction | Variable | Medium | Transient state | +| const_ | Compile-time | Immutable | None | Constants | +| immutable | Deployment | Immutable | Low | Init-only contract vars | + +## Type System + +```zig +enum PrimitiveType { + u8, u16, u32, u64, u128, u256, + bool, address, string +} + +union Type { + primitive: PrimitiveType, + mapping: MappingType, + slice: SliceType, + custom: CustomType, + error_union: ErrorUnionType, + result: ResultType +} +``` + +## Node Structure + +### HIRProgram +```zig +struct HIRProgram { + version: string, + contracts: []Contract, + allocator: Allocator +} +``` + +### Contract +```zig +struct Contract { + name: string, + storage: []StorageVariable, + functions: []Function, + events: []Event, + allocator: Allocator +} +``` + +### Function +```zig +struct Function { + name: string, + visibility: Visibility, + parameters: []Parameter, + return_type: ?Type, + requires: []Expression, + ensures: []Expression, + body: Block, + state_effects: EffectSet, + observable_effects: EffectSet, + effects: FunctionEffects, + location: SourceLocation, + allocator: Allocator +} +``` + +### FunctionEffects +```zig +struct FunctionEffects { + writes_storage: bool, + reads_storage: bool, + writes_transient: bool, + reads_transient: bool, + emits_logs: bool, + calls_other: bool, + modifies_state: bool, + is_pure: bool +} +``` + +## Expressions +```zig +union Expression { + binary, unary, call, index, field, transfer, shift, + old, literal, identifier, try_expr, error_value, error_cast +} +``` + +## Statements +```zig +union Statement { + variable_decl, assignment, compound_assignment, if_statement, + while_statement, return_statement, expression_statement, + lock_statement, unlock_statement, error_decl, + try_statement, error_return +} +``` + +## Effect System + +### Effect +```zig +struct Effect { + type: EffectType, + path: AccessPath, + condition: ?Expression +} +``` + +### AccessPath +```zig +struct AccessPath { + base: string, + selectors: []PathSelector, + region: Region +} +``` + +### PathSelector +```zig +union PathSelector { + field: { name: string }, + index: { index: Expression } +} +``` + +## Effect Analysis +- **Symbol tables are rebuilt per contract** +- **All expressions and statements are walked** +- **Effects are computed recursively** +- **Computed metadata:** + +```zig +modifies_state = writes_storage || writes_transient || emits_logs +is_pure = !(writes_storage || reads_storage || writes_transient || reads_transient || emits_logs || calls_other) +``` + +## Validation Rules +- **All expressions must be typed** +- **Assignments must be type-compatible** +- **Function args must match params** +- **Index ops must match container types** +- **All effects must be consistent with requires/ensures** +- **Return paths must be valid** +- **Invariants must be stated on loops** +- **Error branches must be handled or propagated** + +## Optimization Framework + +```zig +struct OptimizationPass { + name: string, + run: fn(*HIRProgram, Allocator) -> anyerror!void +} +``` + +**Standard passes:** +1. **Dead code elimination** +2. **Constant folding** +3. **Effect optimization** +4. **Gas optimization** + +## JSON Serialization +- **HIR serializes to JSON for tooling/debugging** +- **Effects included as simple flags** +- **Example:** + +```json +{ + "name": "transfer", + "effects": { + "writes_storage": true, + "emits_logs": true, + "is_pure": false + } +} +``` + +## Examples + +### Simple Function HIR +```ora +pub fn transfer(to: address, amount: u256) -> bool + requires(balances[std.transaction.sender] >= amount) + ensures(balances[std.transaction.sender] + balances[to] == + old(balances[std.transaction.sender]) + old(balances[to])) +{ + @lock(balances[to]); + balances from std.transaction.sender -> to : amount; + log Transfer(std.transaction.sender, to, amount); + return true; +} +``` + +**HIR Effects:** +- `writes_storage: true` (modifies balances) +- `emits_logs: true` (emits Transfer event) +- `is_pure: false` (has side effects) + +### Complex Expression HIR +```ora +let result = balances[sender] + balances[receiver]; +``` + +**AccessPath Analysis:** +- `balances[sender]` → `{base: "balances", selectors: [index(sender)], region: storage}` +- `balances[receiver]` → `{base: "balances", selectors: [index(receiver)], region: storage}` + +## Implementation Notes +- **All HIR nodes use allocators** +- **Every node includes source location** +- **Effects tracked both structurally and via summary flags** +- **Per-contract symbol isolation required** + +## Extensions +- **Future: cross-contract effects, verification output, gas metrics** +- **Lock/Transfer annotations may decorate functions with semantic guarantees** + +## Usage in Compilation Pipeline + +1. **AST → HIR**: Convert abstract syntax tree to high-level IR +2. **HIR Validation**: Ensure type safety and effect consistency +3. **HIR Optimization**: Apply optimization passes +4. **HIR → Yul**: Generate Yul code from optimized HIR +5. **Yul → Bytecode**: Compile to EVM bytecode + +The HIR serves as the central representation for analysis, optimization, and code generation in the Ora compiler. \ No newline at end of file diff --git a/website/docs/specifications/index.md b/website/docs/specifications/index.md new file mode 100644 index 0000000..da795c6 --- /dev/null +++ b/website/docs/specifications/index.md @@ -0,0 +1,62 @@ +# Specifications + +This section contains the formal specifications and technical documentation for the Ora smart contract language. + +## Language Specifications + +### [Grammar](./grammar.md) +Complete BNF and EBNF grammar specifications for the Ora language, including: +- Formal syntax rules +- Operator precedence +- Language constructs +- Reserved keywords +- Memory region annotations + +### [HIR (High-level Intermediate Representation)](./hir.md) +Detailed specification of Ora's intermediate representation, covering: +- Memory model and regions +- Effect system +- Type system +- Node structures +- Optimization framework + +### [Formal Verification](./formal-verification.md) +Comprehensive documentation of Ora's formal verification system: +- Proof strategies +- Mathematical domains +- Quantifier support +- SMT solver integration +- Verification examples + +### [API Documentation](./api.md) +Complete API reference for the Ora compiler: +- CLI commands +- Library interfaces +- Compilation pipeline +- Error handling +- Performance benchmarks + +## Implementation Status + +Each specification includes implementation status indicators: +- ✅ **Fully Implemented**: Feature is complete and tested +- 🚧 **In Development**: Framework exists but under active development +- 📋 **Planned**: Feature designed but not yet implemented + +## Contributing + +These specifications are living documents that evolve with the language. Contributions are welcome: + +1. **Grammar improvements**: Help refine language syntax +2. **HIR enhancements**: Extend the intermediate representation +3. **Verification advances**: Improve formal verification capabilities +4. **API extensions**: Add new compiler features + +## Quick Navigation + +- **New to Ora?** Start with the [Grammar](./grammar.md) specification +- **Compiler development?** Check the [HIR](./hir.md) and [API](./api.md) docs +- **Formal verification?** See the [Formal Verification](./formal-verification.md) guide +- **Language implementation?** All specifications work together + +These specifications provide the foundation for understanding and extending the Ora language. \ No newline at end of file diff --git a/website/docusaurus.config.ts b/website/docusaurus.config.ts new file mode 100644 index 0000000..77bda0b --- /dev/null +++ b/website/docusaurus.config.ts @@ -0,0 +1,190 @@ +import { themes as prismThemes } from 'prism-react-renderer'; +import type { Config } from '@docusaurus/types'; +import type * as Preset from '@docusaurus/preset-classic'; + +// This runs in Node.js - Don't use client-side code here (browser APIs, JSX...) + +const config: Config = { + title: 'Ora Development Notebook', + tagline: 'Experimental smart contract language research and development', + favicon: 'img/favicon.ico', + + // Future flags, see https://docusaurus.io/docs/api/docusaurus-config#future + future: { + v4: true, // Improve compatibility with the upcoming Docusaurus v4 + }, + + // Set the production url of your site here + url: 'https://ora-lang.org', + // Set the // pathname under which your site is served + // For GitHub pages deployment, it is often '//' + baseUrl: '/', + + // GitHub pages deployment config. + // If you aren't using GitHub pages, you don't need these. + organizationName: 'oralang', // Usually your GitHub org/user name. + projectName: 'Ora', // Usually your repo name. + + onBrokenLinks: 'throw', + onBrokenMarkdownLinks: 'warn', + + // Even if you don't use internationalization, you can use this field to set + // useful metadata like html lang. For example, if your site is Chinese, you + // may want to replace "en" with "zh-Hans". + i18n: { + defaultLocale: 'en', + locales: ['en'], + }, + + presets: [ + [ + 'classic', + { + docs: { + sidebarPath: './sidebars.ts', + // Please change this to your repo. + // Remove this to remove the "edit this page" links. + editUrl: + 'https://github.com/oralang/Ora/tree/main/website/', + }, + + theme: { + customCss: './src/css/custom.css', + }, + } satisfies Preset.Options, + ], + ], + + themeConfig: { + // Replace with your project's social card + image: 'img/ora-social-card.jpg', + navbar: { + title: 'Ora Notebook', + logo: { + alt: 'Ora Logo', + src: 'img/logo.svg', + }, + items: [ + { + type: 'docSidebar', + sidebarId: 'tutorialSidebar', + position: 'left', + label: 'Documentation', + }, + { + type: 'dropdown', + label: 'Technical Specs', + position: 'left', + items: [ + { + to: '/docs/specifications/', + label: 'Overview', + }, + { + to: '/docs/specifications/grammar', + label: 'Grammar', + }, + { + to: '/docs/specifications/hir', + label: 'HIR', + }, + { + to: '/docs/specifications/formal-verification', + label: 'Formal Verification', + }, + { + to: '/docs/specifications/api', + label: 'API', + }, + ], + }, + { + to: '/api-docs/', + label: 'API Reference', + position: 'left', + }, + { + href: 'https://github.com/oralang/Ora', + label: 'Source Code', + position: 'right', + }, + ], + }, + footer: { + style: 'dark', + links: [ + { + title: 'Development Notebook', + items: [ + { + label: 'Introduction', + to: '/docs/intro', + }, + { + label: 'Getting Started', + to: '/docs/getting-started', + }, + { + label: 'Language Basics', + to: '/docs/language-basics', + }, + { + label: 'Examples', + to: '/docs/examples', + }, + ], + }, + { + title: 'Technical Documentation', + items: [ + { + label: 'Specifications', + to: '/docs/specifications/', + }, + { + label: 'API Reference', + to: '/api-docs/', + }, + { + label: 'Grammar Definition', + to: '/docs/specifications/grammar', + }, + { + label: 'HIR Design', + to: '/docs/specifications/hir', + }, + ], + }, + { + title: 'Development', + items: [ + { + label: 'Source Code', + href: 'https://github.com/oralang/Ora', + }, + { + label: 'Issues & Bugs', + href: 'https://github.com/oralang/Ora/issues', + }, + { + label: 'Discussions', + href: 'https://github.com/oralang/Ora/discussions', + }, + ], + }, + ], + copyright: `Copyright © ${new Date().getFullYear()} Ora Language Project. Experimental research project - not for production use.`, + }, + colorMode: { + defaultMode: 'dark', + disableSwitch: false, + respectPrefersColorScheme: false, + }, + prism: { + theme: prismThemes.github, + darkTheme: prismThemes.dracula, + }, + } satisfies Preset.ThemeConfig, +}; + +export default config; diff --git a/website/package.json b/website/package.json new file mode 100644 index 0000000..074561c --- /dev/null +++ b/website/package.json @@ -0,0 +1,49 @@ +{ + "name": "ora-website", + "version": "0.0.0", + "private": true, + "scripts": { + "docusaurus": "docusaurus", + "start": "docusaurus start", + "build": "docusaurus build", + "swizzle": "docusaurus swizzle", + "deploy": "docusaurus deploy", + "clear": "docusaurus clear", + "serve": "docusaurus serve", + "write-translations": "docusaurus write-translations", + "write-heading-ids": "docusaurus write-heading-ids", + "typecheck": "tsc", + "docs:generate": "cd .. && zig build docs && cp -r zig-out/docs/* website/static/api-docs/", + "docs:build": "npm run docs:generate && npm run build" + }, + "dependencies": { + "@docusaurus/core": "3.8.1", + "@docusaurus/preset-classic": "3.8.1", + "@mdx-js/react": "^3.0.0", + "clsx": "^2.0.0", + "prism-react-renderer": "^2.3.0", + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@docusaurus/module-type-aliases": "3.8.1", + "@docusaurus/tsconfig": "3.8.1", + "@docusaurus/types": "3.8.1", + "typescript": "~5.6.2" + }, + "browserslist": { + "production": [ + ">0.5%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 3 chrome version", + "last 3 firefox version", + "last 5 safari version" + ] + }, + "engines": { + "node": ">=18.0" + } +} \ No newline at end of file diff --git a/website/pnpm-lock.yaml b/website/pnpm-lock.yaml new file mode 100644 index 0000000..e4d0f08 --- /dev/null +++ b/website/pnpm-lock.yaml @@ -0,0 +1,11036 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@docusaurus/core': + specifier: 3.8.1 + version: 3.8.1(@mdx-js/react@3.1.0(@types/react@19.1.8)(react@19.1.0))(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.6.3) + '@docusaurus/preset-classic': + specifier: 3.8.1 + version: 3.8.1(@algolia/client-search@5.33.0)(@mdx-js/react@3.1.0(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(search-insights@2.17.3)(typescript@5.6.3) + '@mdx-js/react': + specifier: ^3.0.0 + version: 3.1.0(@types/react@19.1.8)(react@19.1.0) + clsx: + specifier: ^2.0.0 + version: 2.1.1 + prism-react-renderer: + specifier: ^2.3.0 + version: 2.4.1(react@19.1.0) + react: + specifier: ^19.0.0 + version: 19.1.0 + react-dom: + specifier: ^19.0.0 + version: 19.1.0(react@19.1.0) + devDependencies: + '@docusaurus/module-type-aliases': + specifier: 3.8.1 + version: 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@docusaurus/tsconfig': + specifier: 3.8.1 + version: 3.8.1 + '@docusaurus/types': + specifier: 3.8.1 + version: 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + typescript: + specifier: ~5.6.2 + version: 5.6.3 + +packages: + + '@algolia/autocomplete-core@1.17.9': + resolution: {integrity: sha512-O7BxrpLDPJWWHv/DLA9DRFWs+iY1uOJZkqUwjS5HSZAGcl0hIVCQ97LTLewiZmZ402JYUrun+8NqFP+hCknlbQ==} + + '@algolia/autocomplete-plugin-algolia-insights@1.17.9': + resolution: {integrity: sha512-u1fEHkCbWF92DBeB/KHeMacsjsoI0wFhjZtlCq2ddZbAehshbZST6Hs0Avkc0s+4UyBGbMDnSuXHLuvRWK5iDQ==} + peerDependencies: + search-insights: '>= 1 < 3' + + '@algolia/autocomplete-preset-algolia@1.17.9': + resolution: {integrity: sha512-Na1OuceSJeg8j7ZWn5ssMu/Ax3amtOwk76u4h5J4eK2Nx2KB5qt0Z4cOapCsxot9VcEN11ADV5aUSlQF4RhGjQ==} + peerDependencies: + '@algolia/client-search': '>= 4.9.1 < 6' + algoliasearch: '>= 4.9.1 < 6' + + '@algolia/autocomplete-shared@1.17.9': + resolution: {integrity: sha512-iDf05JDQ7I0b7JEA/9IektxN/80a2MZ1ToohfmNS3rfeuQnIKI3IJlIafD0xu4StbtQTghx9T3Maa97ytkXenQ==} + peerDependencies: + '@algolia/client-search': '>= 4.9.1 < 6' + algoliasearch: '>= 4.9.1 < 6' + + '@algolia/client-abtesting@5.33.0': + resolution: {integrity: sha512-Pyv+iHkkq7BJWFKzdrXm/JSbcTGvrGqJnIMwHYYlKDjuEBWhYt/z4WDLP9MbFZ9cTKb4qe8OvzEmS/0ERW3ibg==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-analytics@5.33.0': + resolution: {integrity: sha512-qkRc7ovjWQQJng6U1yM5esLPNDB0leGCaOh3FEfeWRyLB0xnjLsBEUkKanYq9GrewPvi17l78nDhkqB2SYzTCw==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-common@5.33.0': + resolution: {integrity: sha512-Gq8Z4Fv0DkqDkf/bZl7ZwIF7PSCnRFwpyQoNDnUg+s4SwerXx6VwZJlIx/t5b9+l7vwWsjnKVivCfM4Ab5gw+g==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-insights@5.33.0': + resolution: {integrity: sha512-/tp1oWD3lpSXhAC4n8j0GMDbmN6pd+pATeO1GeURAFP5TVF+2Jz+NbQ1et0uCTzdazOfjEjSIv0fQSLo7bqSgA==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-personalization@5.33.0': + resolution: {integrity: sha512-hZNSqe2BXkrBQ04t5NSlqsNl4u0QrFfhXHbjO5iZ14TWt5jyOdtFMBxF3Qc0o0sqTVYnFIp0xtUbEi+/HkGeyQ==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-query-suggestions@5.33.0': + resolution: {integrity: sha512-kpu2hCIR+848T0lcf3W1GCMe+HQp/LcHceIglA6Dyw6i+y9wH3w8kmXqIV2Svv6JQ9ojEqIL8Knk7NEvD3xIBg==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-search@5.33.0': + resolution: {integrity: sha512-Z5SAqPLxF8KyE9YPO4tAdHrXyb87DUJ0lXhFrcrG+dl/AQT9nqycQhtqDqdcQnfZrj02PImSWZQpxQj34nGZKw==} + engines: {node: '>= 14.0.0'} + + '@algolia/events@4.0.1': + resolution: {integrity: sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==} + + '@algolia/ingestion@1.33.0': + resolution: {integrity: sha512-KNJI60N+twnDLiIY+oGO2Q+syS+yBNOmNdhsB5vCzzrhi3CYs+bufnJ67/BUUfnt+T5+3VlnkvUgDkGBmmZXmA==} + engines: {node: '>= 14.0.0'} + + '@algolia/monitoring@1.33.0': + resolution: {integrity: sha512-47R0kMDTSj8Q7rCUgIRv5Xc518tCBBS0KIZ5oRKg+hspQaJmEO+fxwGLrIIwp5JiaK6y+5sbS7bhtaajelJhpg==} + engines: {node: '>= 14.0.0'} + + '@algolia/recommend@5.33.0': + resolution: {integrity: sha512-HpeLoVQuv5kW9xL0RSq1exa8ueNwyx+9B02dzFonlQzKTaSedM0jiWo6m3nWpi1hChAKqjzkL40FkxrgyrWTSg==} + engines: {node: '>= 14.0.0'} + + '@algolia/requester-browser-xhr@5.33.0': + resolution: {integrity: sha512-uOqDkvY7s9c9rkaZ4+n69LkTmZ5ax3el+8u6ipvODfj1P3HzrGvMUVFy/nGSXxw+XITKcIRphPQcyqn15b02dA==} + engines: {node: '>= 14.0.0'} + + '@algolia/requester-fetch@5.33.0': + resolution: {integrity: sha512-NzTEGjwjPhUXPsrjj9nXM43+jtBVeL6UgGNBTQKsxjpqJ3EEAQ2Kq5g7DRK6mVDTQiTBWvBLKChJpn4qxwtLsg==} + engines: {node: '>= 14.0.0'} + + '@algolia/requester-node-http@5.33.0': + resolution: {integrity: sha512-FhEE19ScAYuXL3VLj2I3KhL7683gZwZoa+BQZUEnA05vSbVBhCAqUBQgiVu7j2RF3VceqLX3+GEeY0bHs4y7eA==} + engines: {node: '>= 14.0.0'} + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.28.0': + resolution: {integrity: sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.28.0': + resolution: {integrity: sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.28.0': + resolution: {integrity: sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.27.3': + resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.27.2': + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-create-class-features-plugin@7.27.1': + resolution: {integrity: sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-create-regexp-features-plugin@7.27.1': + resolution: {integrity: sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-define-polyfill-provider@0.6.5': + resolution: {integrity: sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-member-expression-to-functions@7.27.1': + resolution: {integrity: sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.27.3': + resolution: {integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-optimise-call-expression@7.27.1': + resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-plugin-utils@7.27.1': + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-remap-async-to-generator@7.27.1': + resolution: {integrity: sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-replace-supers@7.27.1': + resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-wrap-function@7.27.1': + resolution: {integrity: sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.27.6': + resolution: {integrity: sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.28.0': + resolution: {integrity: sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1': + resolution: {integrity: sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1': + resolution: {integrity: sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1': + resolution: {integrity: sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1': + resolution: {integrity: sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.27.1': + resolution: {integrity: sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': + resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-dynamic-import@7.8.3': + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-assertions@7.27.1': + resolution: {integrity: sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-attributes@7.27.1': + resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-jsx@7.27.1': + resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.27.1': + resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6': + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-arrow-functions@7.27.1': + resolution: {integrity: sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-async-generator-functions@7.28.0': + resolution: {integrity: sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-async-to-generator@7.27.1': + resolution: {integrity: sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-block-scoped-functions@7.27.1': + resolution: {integrity: sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-block-scoping@7.28.0': + resolution: {integrity: sha512-gKKnwjpdx5sER/wl0WN0efUBFzF/56YZO0RJrSYP4CljXnP31ByY7fol89AzomdlLNzI36AvOTmYHsnZTCkq8Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-class-properties@7.27.1': + resolution: {integrity: sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-class-static-block@7.27.1': + resolution: {integrity: sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + + '@babel/plugin-transform-classes@7.28.0': + resolution: {integrity: sha512-IjM1IoJNw72AZFlj33Cu8X0q2XK/6AaVC3jQu+cgQ5lThWD5ajnuUAml80dqRmOhmPkTH8uAwnpMu9Rvj0LTRA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-computed-properties@7.27.1': + resolution: {integrity: sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-destructuring@7.28.0': + resolution: {integrity: sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-dotall-regex@7.27.1': + resolution: {integrity: sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-duplicate-keys@7.27.1': + resolution: {integrity: sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1': + resolution: {integrity: sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-dynamic-import@7.27.1': + resolution: {integrity: sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-explicit-resource-management@7.28.0': + resolution: {integrity: sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-exponentiation-operator@7.27.1': + resolution: {integrity: sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-export-namespace-from@7.27.1': + resolution: {integrity: sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-for-of@7.27.1': + resolution: {integrity: sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-function-name@7.27.1': + resolution: {integrity: sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-json-strings@7.27.1': + resolution: {integrity: sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-literals@7.27.1': + resolution: {integrity: sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-logical-assignment-operators@7.27.1': + resolution: {integrity: sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-member-expression-literals@7.27.1': + resolution: {integrity: sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-amd@7.27.1': + resolution: {integrity: sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-commonjs@7.27.1': + resolution: {integrity: sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-systemjs@7.27.1': + resolution: {integrity: sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-umd@7.27.1': + resolution: {integrity: sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-named-capturing-groups-regex@7.27.1': + resolution: {integrity: sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-new-target@7.27.1': + resolution: {integrity: sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-nullish-coalescing-operator@7.27.1': + resolution: {integrity: sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-numeric-separator@7.27.1': + resolution: {integrity: sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-object-rest-spread@7.28.0': + resolution: {integrity: sha512-9VNGikXxzu5eCiQjdE4IZn8sb9q7Xsk5EXLDBKUYg1e/Tve8/05+KJEtcxGxAgCY5t/BpKQM+JEL/yT4tvgiUA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-object-super@7.27.1': + resolution: {integrity: sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-optional-catch-binding@7.27.1': + resolution: {integrity: sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-optional-chaining@7.27.1': + resolution: {integrity: sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-parameters@7.27.7': + resolution: {integrity: sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-private-methods@7.27.1': + resolution: {integrity: sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-private-property-in-object@7.27.1': + resolution: {integrity: sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-property-literals@7.27.1': + resolution: {integrity: sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-constant-elements@7.27.1': + resolution: {integrity: sha512-edoidOjl/ZxvYo4lSBOQGDSyToYVkTAwyVoa2tkuYTSmjrB1+uAedoL5iROVLXkxH+vRgA7uP4tMg2pUJpZ3Ug==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-display-name@7.28.0': + resolution: {integrity: sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-development@7.27.1': + resolution: {integrity: sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx@7.27.1': + resolution: {integrity: sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-pure-annotations@7.27.1': + resolution: {integrity: sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-regenerator@7.28.1': + resolution: {integrity: sha512-P0QiV/taaa3kXpLY+sXla5zec4E+4t4Aqc9ggHlfZ7a2cp8/x/Gv08jfwEtn9gnnYIMvHx6aoOZ8XJL8eU71Dg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-regexp-modifiers@7.27.1': + resolution: {integrity: sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-reserved-words@7.27.1': + resolution: {integrity: sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-runtime@7.28.0': + resolution: {integrity: sha512-dGopk9nZrtCs2+nfIem25UuHyt5moSJamArzIoh9/vezUQPmYDOzjaHDCkAzuGJibCIkPup8rMT2+wYB6S73cA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-shorthand-properties@7.27.1': + resolution: {integrity: sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-spread@7.27.1': + resolution: {integrity: sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-sticky-regex@7.27.1': + resolution: {integrity: sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-template-literals@7.27.1': + resolution: {integrity: sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typeof-symbol@7.27.1': + resolution: {integrity: sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typescript@7.28.0': + resolution: {integrity: sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-escapes@7.27.1': + resolution: {integrity: sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-property-regex@7.27.1': + resolution: {integrity: sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-regex@7.27.1': + resolution: {integrity: sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-sets-regex@7.27.1': + resolution: {integrity: sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/preset-env@7.28.0': + resolution: {integrity: sha512-VmaxeGOwuDqzLl5JUkIRM1X2Qu2uKGxHEQWh+cvvbl7JuJRgKGJSfsEF/bUaxFhJl/XAyxBe7q7qSuTbKFuCyg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-modules@0.1.6-no-external-plugins': + resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + + '@babel/preset-react@7.27.1': + resolution: {integrity: sha512-oJHWh2gLhU9dW9HHr42q0cI0/iHHXTLGe39qvpAZZzagHy0MzYLCnCVV0symeRvzmjHyVU7mw2K06E6u/JwbhA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-typescript@7.27.1': + resolution: {integrity: sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/runtime-corejs3@7.28.0': + resolution: {integrity: sha512-nlIXnSqLcBij8K8TtkxbBJgfzfvi75V1pAKSM7dUXejGw12vJAqez74jZrHTsJ3Z+Aczc5Q/6JgNjKRMsVU44g==} + engines: {node: '>=6.9.0'} + + '@babel/runtime@7.27.6': + resolution: {integrity: sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.28.0': + resolution: {integrity: sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.28.1': + resolution: {integrity: sha512-x0LvFTekgSX+83TI28Y9wYPUfzrnl2aT5+5QLnO6v7mSJYtEEevuDRN0F0uSHRk1G1IWZC43o00Y0xDDrpBGPQ==} + engines: {node: '>=6.9.0'} + + '@colors/colors@1.5.0': + resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} + engines: {node: '>=0.1.90'} + + '@csstools/cascade-layer-name-parser@2.0.5': + resolution: {integrity: sha512-p1ko5eHgV+MgXFVa4STPKpvPxr6ReS8oS2jzTukjR74i5zJNyWO1ZM1m8YKBXnzDKWfBN1ztLYlHxbVemDD88A==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/color-helpers@5.0.2': + resolution: {integrity: sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==} + engines: {node: '>=18'} + + '@csstools/css-calc@2.1.4': + resolution: {integrity: sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-color-parser@3.0.10': + resolution: {integrity: sha512-TiJ5Ajr6WRd1r8HSiwJvZBiJOqtH86aHpUjq5aEKWHiII2Qfjqd/HCWKPOW8EP4vcspXbHnXrwIDlu5savQipg==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-parser-algorithms@3.0.5': + resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-tokenizer@3.0.4': + resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} + engines: {node: '>=18'} + + '@csstools/media-query-list-parser@4.0.3': + resolution: {integrity: sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/postcss-cascade-layers@5.0.2': + resolution: {integrity: sha512-nWBE08nhO8uWl6kSAeCx4im7QfVko3zLrtgWZY4/bP87zrSPpSyN/3W3TDqz1jJuH+kbKOHXg5rJnK+ZVYcFFg==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-color-function@4.0.10': + resolution: {integrity: sha512-4dY0NBu7NVIpzxZRgh/Q/0GPSz/jLSw0i/u3LTUor0BkQcz/fNhN10mSWBDsL0p9nDb0Ky1PD6/dcGbhACuFTQ==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-color-mix-function@3.0.10': + resolution: {integrity: sha512-P0lIbQW9I4ShE7uBgZRib/lMTf9XMjJkFl/d6w4EMNHu2qvQ6zljJGEcBkw/NsBtq/6q3WrmgxSS8kHtPMkK4Q==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-color-mix-variadic-function-arguments@1.0.0': + resolution: {integrity: sha512-Z5WhouTyD74dPFPrVE7KydgNS9VvnjB8qcdes9ARpCOItb4jTnm7cHp4FhxCRUoyhabD0WVv43wbkJ4p8hLAlQ==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-content-alt-text@2.0.6': + resolution: {integrity: sha512-eRjLbOjblXq+byyaedQRSrAejKGNAFued+LcbzT+LCL78fabxHkxYjBbxkroONxHHYu2qxhFK2dBStTLPG3jpQ==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-exponential-functions@2.0.9': + resolution: {integrity: sha512-abg2W/PI3HXwS/CZshSa79kNWNZHdJPMBXeZNyPQFbbj8sKO3jXxOt/wF7juJVjyDTc6JrvaUZYFcSBZBhaxjw==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-font-format-keywords@4.0.0': + resolution: {integrity: sha512-usBzw9aCRDvchpok6C+4TXC57btc4bJtmKQWOHQxOVKen1ZfVqBUuCZ/wuqdX5GHsD0NRSr9XTP+5ID1ZZQBXw==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-gamut-mapping@2.0.10': + resolution: {integrity: sha512-QDGqhJlvFnDlaPAfCYPsnwVA6ze+8hhrwevYWlnUeSjkkZfBpcCO42SaUD8jiLlq7niouyLgvup5lh+f1qessg==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-gradients-interpolation-method@5.0.10': + resolution: {integrity: sha512-HHPauB2k7Oits02tKFUeVFEU2ox/H3OQVrP3fSOKDxvloOikSal+3dzlyTZmYsb9FlY9p5EUpBtz0//XBmy+aw==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-hwb-function@4.0.10': + resolution: {integrity: sha512-nOKKfp14SWcdEQ++S9/4TgRKchooLZL0TUFdun3nI4KPwCjETmhjta1QT4ICQcGVWQTvrsgMM/aLB5We+kMHhQ==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-ic-unit@4.0.2': + resolution: {integrity: sha512-lrK2jjyZwh7DbxaNnIUjkeDmU8Y6KyzRBk91ZkI5h8nb1ykEfZrtIVArdIjX4DHMIBGpdHrgP0n4qXDr7OHaKA==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-initial@2.0.1': + resolution: {integrity: sha512-L1wLVMSAZ4wovznquK0xmC7QSctzO4D0Is590bxpGqhqjboLXYA16dWZpfwImkdOgACdQ9PqXsuRroW6qPlEsg==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-is-pseudo-class@5.0.3': + resolution: {integrity: sha512-jS/TY4SpG4gszAtIg7Qnf3AS2pjcUM5SzxpApOrlndMeGhIbaTzWBzzP/IApXoNWEW7OhcjkRT48jnAUIFXhAQ==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-light-dark-function@2.0.9': + resolution: {integrity: sha512-1tCZH5bla0EAkFAI2r0H33CDnIBeLUaJh1p+hvvsylJ4svsv2wOmJjJn+OXwUZLXef37GYbRIVKX+X+g6m+3CQ==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-logical-float-and-clear@3.0.0': + resolution: {integrity: sha512-SEmaHMszwakI2rqKRJgE+8rpotFfne1ZS6bZqBoQIicFyV+xT1UF42eORPxJkVJVrH9C0ctUgwMSn3BLOIZldQ==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-logical-overflow@2.0.0': + resolution: {integrity: sha512-spzR1MInxPuXKEX2csMamshR4LRaSZ3UXVaRGjeQxl70ySxOhMpP2252RAFsg8QyyBXBzuVOOdx1+bVO5bPIzA==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-logical-overscroll-behavior@2.0.0': + resolution: {integrity: sha512-e/webMjoGOSYfqLunyzByZj5KKe5oyVg/YSbie99VEaSDE2kimFm0q1f6t/6Jo+VVCQ/jbe2Xy+uX+C4xzWs4w==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-logical-resize@3.0.0': + resolution: {integrity: sha512-DFbHQOFW/+I+MY4Ycd/QN6Dg4Hcbb50elIJCfnwkRTCX05G11SwViI5BbBlg9iHRl4ytB7pmY5ieAFk3ws7yyg==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-logical-viewport-units@3.0.4': + resolution: {integrity: sha512-q+eHV1haXA4w9xBwZLKjVKAWn3W2CMqmpNpZUk5kRprvSiBEGMgrNH3/sJZ8UA3JgyHaOt3jwT9uFa4wLX4EqQ==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-media-minmax@2.0.9': + resolution: {integrity: sha512-af9Qw3uS3JhYLnCbqtZ9crTvvkR+0Se+bBqSr7ykAnl9yKhk6895z9rf+2F4dClIDJWxgn0iZZ1PSdkhrbs2ig==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-media-queries-aspect-ratio-number-values@3.0.5': + resolution: {integrity: sha512-zhAe31xaaXOY2Px8IYfoVTB3wglbJUVigGphFLj6exb7cjZRH9A6adyE22XfFK3P2PzwRk0VDeTJmaxpluyrDg==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-nested-calc@4.0.0': + resolution: {integrity: sha512-jMYDdqrQQxE7k9+KjstC3NbsmC063n1FTPLCgCRS2/qHUbHM0mNy9pIn4QIiQGs9I/Bg98vMqw7mJXBxa0N88A==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-normalize-display-values@4.0.0': + resolution: {integrity: sha512-HlEoG0IDRoHXzXnkV4in47dzsxdsjdz6+j7MLjaACABX2NfvjFS6XVAnpaDyGesz9gK2SC7MbNwdCHusObKJ9Q==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-oklab-function@4.0.10': + resolution: {integrity: sha512-ZzZUTDd0fgNdhv8UUjGCtObPD8LYxMH+MJsW9xlZaWTV8Ppr4PtxlHYNMmF4vVWGl0T6f8tyWAKjoI6vePSgAg==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-progressive-custom-properties@4.1.0': + resolution: {integrity: sha512-YrkI9dx8U4R8Sz2EJaoeD9fI7s7kmeEBfmO+UURNeL6lQI7VxF6sBE+rSqdCBn4onwqmxFdBU3lTwyYb/lCmxA==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-random-function@2.0.1': + resolution: {integrity: sha512-q+FQaNiRBhnoSNo+GzqGOIBKoHQ43lYz0ICrV+UudfWnEF6ksS6DsBIJSISKQT2Bvu3g4k6r7t0zYrk5pDlo8w==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-relative-color-syntax@3.0.10': + resolution: {integrity: sha512-8+0kQbQGg9yYG8hv0dtEpOMLwB9M+P7PhacgIzVzJpixxV4Eq9AUQtQw8adMmAJU1RBBmIlpmtmm3XTRd/T00g==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-scope-pseudo-class@4.0.1': + resolution: {integrity: sha512-IMi9FwtH6LMNuLea1bjVMQAsUhFxJnyLSgOp/cpv5hrzWmrUYU5fm0EguNDIIOHUqzXode8F/1qkC/tEo/qN8Q==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-sign-functions@1.1.4': + resolution: {integrity: sha512-P97h1XqRPcfcJndFdG95Gv/6ZzxUBBISem0IDqPZ7WMvc/wlO+yU0c5D/OCpZ5TJoTt63Ok3knGk64N+o6L2Pg==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-stepped-value-functions@4.0.9': + resolution: {integrity: sha512-h9btycWrsex4dNLeQfyU3y3w40LMQooJWFMm/SK9lrKguHDcFl4VMkncKKoXi2z5rM9YGWbUQABI8BT2UydIcA==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-text-decoration-shorthand@4.0.2': + resolution: {integrity: sha512-8XvCRrFNseBSAGxeaVTaNijAu+FzUvjwFXtcrynmazGb/9WUdsPCpBX+mHEHShVRq47Gy4peYAoxYs8ltUnmzA==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-trigonometric-functions@4.0.9': + resolution: {integrity: sha512-Hnh5zJUdpNrJqK9v1/E3BbrQhaDTj5YiX7P61TOvUhoDHnUmsNNxcDAgkQ32RrcWx9GVUvfUNPcUkn8R3vIX6A==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-unset-value@4.0.0': + resolution: {integrity: sha512-cBz3tOCI5Fw6NIFEwU3RiwK6mn3nKegjpJuzCndoGq3BZPkUjnsq7uQmIeMNeMbMk7YD2MfKcgCpZwX5jyXqCA==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/selector-resolve-nested@3.1.0': + resolution: {integrity: sha512-mf1LEW0tJLKfWyvn5KdDrhpxHyuxpbNwTIwOYLIvsTffeyOf85j5oIzfG0yosxDgx/sswlqBnESYUcQH0vgZ0g==} + engines: {node: '>=18'} + peerDependencies: + postcss-selector-parser: ^7.0.0 + + '@csstools/selector-specificity@5.0.0': + resolution: {integrity: sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==} + engines: {node: '>=18'} + peerDependencies: + postcss-selector-parser: ^7.0.0 + + '@csstools/utilities@2.0.0': + resolution: {integrity: sha512-5VdOr0Z71u+Yp3ozOx8T11N703wIFGVRgOWbOZMKgglPJsWA54MRIoMNVMa7shUToIhx5J8vX4sOZgD2XiihiQ==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@discoveryjs/json-ext@0.5.7': + resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} + engines: {node: '>=10.0.0'} + + '@docsearch/css@3.9.0': + resolution: {integrity: sha512-cQbnVbq0rrBwNAKegIac/t6a8nWoUAn8frnkLFW6YARaRmAQr5/Eoe6Ln2fqkUCZ40KpdrKbpSAmgrkviOxuWA==} + + '@docsearch/react@3.9.0': + resolution: {integrity: sha512-mb5FOZYZIkRQ6s/NWnM98k879vu5pscWqTLubLFBO87igYYT4VzVazh4h5o/zCvTIZgEt3PvsCOMOswOUo9yHQ==} + peerDependencies: + '@types/react': '>= 16.8.0 < 20.0.0' + react: '>= 16.8.0 < 20.0.0' + react-dom: '>= 16.8.0 < 20.0.0' + search-insights: '>= 1 < 3' + peerDependenciesMeta: + '@types/react': + optional: true + react: + optional: true + react-dom: + optional: true + search-insights: + optional: true + + '@docusaurus/babel@3.8.1': + resolution: {integrity: sha512-3brkJrml8vUbn9aeoZUlJfsI/GqyFcDgQJwQkmBtclJgWDEQBKKeagZfOgx0WfUQhagL1sQLNW0iBdxnI863Uw==} + engines: {node: '>=18.0'} + + '@docusaurus/bundler@3.8.1': + resolution: {integrity: sha512-/z4V0FRoQ0GuSLToNjOSGsk6m2lQUG4FRn8goOVoZSRsTrU8YR2aJacX5K3RG18EaX9b+52pN4m1sL3MQZVsQA==} + engines: {node: '>=18.0'} + peerDependencies: + '@docusaurus/faster': '*' + peerDependenciesMeta: + '@docusaurus/faster': + optional: true + + '@docusaurus/core@3.8.1': + resolution: {integrity: sha512-ENB01IyQSqI2FLtOzqSI3qxG2B/jP4gQPahl2C3XReiLebcVh5B5cB9KYFvdoOqOWPyr5gXK4sjgTKv7peXCrA==} + engines: {node: '>=18.0'} + hasBin: true + peerDependencies: + '@mdx-js/react': ^3.0.0 + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + + '@docusaurus/cssnano-preset@3.8.1': + resolution: {integrity: sha512-G7WyR2N6SpyUotqhGznERBK+x84uyhfMQM2MmDLs88bw4Flom6TY46HzkRkSEzaP9j80MbTN8naiL1fR17WQug==} + engines: {node: '>=18.0'} + + '@docusaurus/logger@3.8.1': + resolution: {integrity: sha512-2wjeGDhKcExEmjX8k1N/MRDiPKXGF2Pg+df/bDDPnnJWHXnVEZxXj80d6jcxp1Gpnksl0hF8t/ZQw9elqj2+ww==} + engines: {node: '>=18.0'} + + '@docusaurus/mdx-loader@3.8.1': + resolution: {integrity: sha512-DZRhagSFRcEq1cUtBMo4TKxSNo/W6/s44yhr8X+eoXqCLycFQUylebOMPseHi5tc4fkGJqwqpWJLz6JStU9L4w==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + + '@docusaurus/module-type-aliases@3.8.1': + resolution: {integrity: sha512-6xhvAJiXzsaq3JdosS7wbRt/PwEPWHr9eM4YNYqVlbgG1hSK3uQDXTVvQktasp3VO6BmfYWPozueLWuj4gB+vg==} + peerDependencies: + react: '*' + react-dom: '*' + + '@docusaurus/plugin-content-blog@3.8.1': + resolution: {integrity: sha512-vNTpMmlvNP9n3hGEcgPaXyvTljanAKIUkuG9URQ1DeuDup0OR7Ltvoc8yrmH+iMZJbcQGhUJF+WjHLwuk8HSdw==} + engines: {node: '>=18.0'} + peerDependencies: + '@docusaurus/plugin-content-docs': '*' + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + + '@docusaurus/plugin-content-docs@3.8.1': + resolution: {integrity: sha512-oByRkSZzeGNQByCMaX+kif5Nl2vmtj2IHQI2fWjCfCootsdKZDPFLonhIp5s3IGJO7PLUfe0POyw0Xh/RrGXJA==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + + '@docusaurus/plugin-content-pages@3.8.1': + resolution: {integrity: sha512-a+V6MS2cIu37E/m7nDJn3dcxpvXb6TvgdNI22vJX8iUTp8eoMoPa0VArEbWvCxMY/xdC26WzNv4wZ6y0iIni/w==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + + '@docusaurus/plugin-css-cascade-layers@3.8.1': + resolution: {integrity: sha512-VQ47xRxfNKjHS5ItzaVXpxeTm7/wJLFMOPo1BkmoMG4Cuz4nuI+Hs62+RMk1OqVog68Swz66xVPK8g9XTrBKRw==} + engines: {node: '>=18.0'} + + '@docusaurus/plugin-debug@3.8.1': + resolution: {integrity: sha512-nT3lN7TV5bi5hKMB7FK8gCffFTBSsBsAfV84/v293qAmnHOyg1nr9okEw8AiwcO3bl9vije5nsUvP0aRl2lpaw==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + + '@docusaurus/plugin-google-analytics@3.8.1': + resolution: {integrity: sha512-Hrb/PurOJsmwHAsfMDH6oVpahkEGsx7F8CWMjyP/dw1qjqmdS9rcV1nYCGlM8nOtD3Wk/eaThzUB5TSZsGz+7Q==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + + '@docusaurus/plugin-google-gtag@3.8.1': + resolution: {integrity: sha512-tKE8j1cEZCh8KZa4aa80zpSTxsC2/ZYqjx6AAfd8uA8VHZVw79+7OTEP2PoWi0uL5/1Is0LF5Vwxd+1fz5HlKg==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + + '@docusaurus/plugin-google-tag-manager@3.8.1': + resolution: {integrity: sha512-iqe3XKITBquZq+6UAXdb1vI0fPY5iIOitVjPQ581R1ZKpHr0qe+V6gVOrrcOHixPDD/BUKdYwkxFjpNiEN+vBw==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + + '@docusaurus/plugin-sitemap@3.8.1': + resolution: {integrity: sha512-+9YV/7VLbGTq8qNkjiugIelmfUEVkTyLe6X8bWq7K5qPvGXAjno27QAfFq63mYfFFbJc7z+pudL63acprbqGzw==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + + '@docusaurus/plugin-svgr@3.8.1': + resolution: {integrity: sha512-rW0LWMDsdlsgowVwqiMb/7tANDodpy1wWPwCcamvhY7OECReN3feoFwLjd/U4tKjNY3encj0AJSTxJA+Fpe+Gw==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + + '@docusaurus/preset-classic@3.8.1': + resolution: {integrity: sha512-yJSjYNHXD8POMGc2mKQuj3ApPrN+eG0rO1UPgSx7jySpYU+n4WjBikbrA2ue5ad9A7aouEtMWUoiSRXTH/g7KQ==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + + '@docusaurus/react-loadable@6.0.0': + resolution: {integrity: sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==} + peerDependencies: + react: '*' + + '@docusaurus/theme-classic@3.8.1': + resolution: {integrity: sha512-bqDUCNqXeYypMCsE1VcTXSI1QuO4KXfx8Cvl6rYfY0bhhqN6d2WZlRkyLg/p6pm+DzvanqHOyYlqdPyP0iz+iw==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + + '@docusaurus/theme-common@3.8.1': + resolution: {integrity: sha512-UswMOyTnPEVRvN5Qzbo+l8k4xrd5fTFu2VPPfD6FcW/6qUtVLmJTQCktbAL3KJ0BVXGm5aJXz/ZrzqFuZERGPw==} + engines: {node: '>=18.0'} + peerDependencies: + '@docusaurus/plugin-content-docs': '*' + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + + '@docusaurus/theme-search-algolia@3.8.1': + resolution: {integrity: sha512-NBFH5rZVQRAQM087aYSRKQ9yGEK9eHd+xOxQjqNpxMiV85OhJDD4ZGz6YJIod26Fbooy54UWVdzNU0TFeUUUzQ==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + + '@docusaurus/theme-translations@3.8.1': + resolution: {integrity: sha512-OTp6eebuMcf2rJt4bqnvuwmm3NVXfzfYejL+u/Y1qwKhZPrjPoKWfk1CbOP5xH5ZOPkiAsx4dHdQBRJszK3z2g==} + engines: {node: '>=18.0'} + + '@docusaurus/tsconfig@3.8.1': + resolution: {integrity: sha512-XBWCcqhRHhkhfolnSolNL+N7gj3HVE3CoZVqnVjfsMzCoOsuQw2iCLxVVHtO+rePUUfouVZHURDgmqIySsF66A==} + + '@docusaurus/types@3.8.1': + resolution: {integrity: sha512-ZPdW5AB+pBjiVrcLuw3dOS6BFlrG0XkS2lDGsj8TizcnREQg3J8cjsgfDviszOk4CweNfwo1AEELJkYaMUuOPg==} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + + '@docusaurus/utils-common@3.8.1': + resolution: {integrity: sha512-zTZiDlvpvoJIrQEEd71c154DkcriBecm4z94OzEE9kz7ikS3J+iSlABhFXM45mZ0eN5pVqqr7cs60+ZlYLewtg==} + engines: {node: '>=18.0'} + + '@docusaurus/utils-validation@3.8.1': + resolution: {integrity: sha512-gs5bXIccxzEbyVecvxg6upTwaUbfa0KMmTj7HhHzc016AGyxH2o73k1/aOD0IFrdCsfJNt37MqNI47s2MgRZMA==} + engines: {node: '>=18.0'} + + '@docusaurus/utils@3.8.1': + resolution: {integrity: sha512-P1ml0nvOmEFdmu0smSXOqTS1sxU5tqvnc0dA4MTKV39kye+bhQnjkIKEE18fNOvxjyB86k8esoCIFM3x4RykOQ==} + engines: {node: '>=18.0'} + + '@hapi/hoek@9.3.0': + resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} + + '@hapi/topo@5.1.0': + resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} + + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/types@29.6.3': + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jridgewell/gen-mapping@0.3.12': + resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.10': + resolution: {integrity: sha512-0pPkgz9dY+bijgistcTTJ5mR+ocqRXLuhXHYdzoMmmoJ2C9S46RCm2GMUbatPEUK9Yjy26IrAy8D/M00lLkv+Q==} + + '@jridgewell/sourcemap-codec@1.5.4': + resolution: {integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==} + + '@jridgewell/trace-mapping@0.3.29': + resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} + + '@leichtgewicht/ip-codec@2.0.5': + resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} + + '@mdx-js/mdx@3.1.0': + resolution: {integrity: sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==} + + '@mdx-js/react@3.1.0': + resolution: {integrity: sha512-QjHtSaoameoalGnKDT3FoIl4+9RwyTmo9ZJGBdLOks/YOiWHoRDI3PUwEzOE7kEmGcV3AFcp9K6dYu9rEuKLAQ==} + peerDependencies: + '@types/react': '>=16' + react: '>=16' + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@pnpm/config.env-replace@1.1.0': + resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} + engines: {node: '>=12.22.0'} + + '@pnpm/network.ca-file@1.0.2': + resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==} + engines: {node: '>=12.22.0'} + + '@pnpm/npm-conf@2.3.1': + resolution: {integrity: sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==} + engines: {node: '>=12'} + + '@polka/url@1.0.0-next.29': + resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} + + '@sideway/address@4.1.5': + resolution: {integrity: sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==} + + '@sideway/formula@3.0.1': + resolution: {integrity: sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==} + + '@sideway/pinpoint@2.0.0': + resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} + + '@sinclair/typebox@0.27.8': + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + + '@sindresorhus/is@4.6.0': + resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} + engines: {node: '>=10'} + + '@sindresorhus/is@5.6.0': + resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} + engines: {node: '>=14.16'} + + '@slorber/react-helmet-async@1.3.0': + resolution: {integrity: sha512-e9/OK8VhwUSc67diWI8Rb3I0YgI9/SBQtnhe9aEuK6MhZm7ntZZimXgwXnd8W96YTmSOb9M4d8LwhRZyhWr/1A==} + peerDependencies: + react: ^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + '@slorber/remark-comment@1.0.0': + resolution: {integrity: sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA==} + + '@svgr/babel-plugin-add-jsx-attribute@8.0.0': + resolution: {integrity: sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-remove-jsx-attribute@8.0.0': + resolution: {integrity: sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0': + resolution: {integrity: sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0': + resolution: {integrity: sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-svg-dynamic-title@8.0.0': + resolution: {integrity: sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-svg-em-dimensions@8.0.0': + resolution: {integrity: sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-transform-react-native-svg@8.1.0': + resolution: {integrity: sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-transform-svg-component@8.0.0': + resolution: {integrity: sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==} + engines: {node: '>=12'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-preset@8.1.0': + resolution: {integrity: sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/core@8.1.0': + resolution: {integrity: sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==} + engines: {node: '>=14'} + + '@svgr/hast-util-to-babel-ast@8.0.0': + resolution: {integrity: sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==} + engines: {node: '>=14'} + + '@svgr/plugin-jsx@8.1.0': + resolution: {integrity: sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==} + engines: {node: '>=14'} + peerDependencies: + '@svgr/core': '*' + + '@svgr/plugin-svgo@8.1.0': + resolution: {integrity: sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==} + engines: {node: '>=14'} + peerDependencies: + '@svgr/core': '*' + + '@svgr/webpack@8.1.0': + resolution: {integrity: sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==} + engines: {node: '>=14'} + + '@szmarczak/http-timer@5.0.1': + resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} + engines: {node: '>=14.16'} + + '@trysound/sax@0.2.0': + resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} + engines: {node: '>=10.13.0'} + + '@types/body-parser@1.19.6': + resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} + + '@types/bonjour@3.5.13': + resolution: {integrity: sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==} + + '@types/connect-history-api-fallback@1.5.4': + resolution: {integrity: sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==} + + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/eslint-scope@3.7.7': + resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + + '@types/eslint@9.6.1': + resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} + + '@types/estree-jsx@1.0.5': + resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/express-serve-static-core@4.19.6': + resolution: {integrity: sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==} + + '@types/express-serve-static-core@5.0.7': + resolution: {integrity: sha512-R+33OsgWw7rOhD1emjU7dzCDHucJrgJXMA5PYCzJxVil0dsyx5iBEPHqpPfiKNJQb7lZ1vxwoLR4Z87bBUpeGQ==} + + '@types/express@4.17.23': + resolution: {integrity: sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==} + + '@types/gtag.js@0.0.12': + resolution: {integrity: sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg==} + + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + + '@types/history@4.7.11': + resolution: {integrity: sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==} + + '@types/html-minifier-terser@6.1.0': + resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==} + + '@types/http-cache-semantics@4.0.4': + resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + + '@types/http-errors@2.0.5': + resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} + + '@types/http-proxy@1.17.16': + resolution: {integrity: sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==} + + '@types/istanbul-lib-coverage@2.0.6': + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + + '@types/istanbul-lib-report@3.0.3': + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + + '@types/istanbul-reports@3.0.4': + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/mdx@2.0.13': + resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} + + '@types/mime@1.3.5': + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + '@types/node-forge@1.3.13': + resolution: {integrity: sha512-zePQJSW5QkwSHKRApqWCVKeKoSOt4xvEnLENZPjyvm9Ezdf/EyDeJM7jqLzOwjVICQQzvLZ63T55MKdJB5H6ww==} + + '@types/node@17.0.45': + resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} + + '@types/node@24.0.14': + resolution: {integrity: sha512-4zXMWD91vBLGRtHK3YbIoFMia+1nqEz72coM42C5ETjnNCa/heoj7NT1G67iAfOqMmcfhuCZ4uNpyz8EjlAejw==} + + '@types/prismjs@1.26.5': + resolution: {integrity: sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==} + + '@types/qs@6.14.0': + resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} + + '@types/range-parser@1.2.7': + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + + '@types/react-router-config@5.0.11': + resolution: {integrity: sha512-WmSAg7WgqW7m4x8Mt4N6ZyKz0BubSj/2tVUMsAHp+Yd2AMwcSbeFq9WympT19p5heCFmF97R9eD5uUR/t4HEqw==} + + '@types/react-router-dom@5.3.3': + resolution: {integrity: sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==} + + '@types/react-router@5.1.20': + resolution: {integrity: sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==} + + '@types/react@19.1.8': + resolution: {integrity: sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g==} + + '@types/retry@0.12.0': + resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} + + '@types/sax@1.2.7': + resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==} + + '@types/send@0.17.5': + resolution: {integrity: sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==} + + '@types/serve-index@1.9.4': + resolution: {integrity: sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==} + + '@types/serve-static@1.15.8': + resolution: {integrity: sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==} + + '@types/sockjs@0.3.36': + resolution: {integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==} + + '@types/unist@2.0.11': + resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@types/ws@8.18.1': + resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} + + '@types/yargs-parser@21.0.3': + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + + '@types/yargs@17.0.33': + resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} + + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + + '@webassemblyjs/ast@1.14.1': + resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} + + '@webassemblyjs/floating-point-hex-parser@1.13.2': + resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==} + + '@webassemblyjs/helper-api-error@1.13.2': + resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==} + + '@webassemblyjs/helper-buffer@1.14.1': + resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==} + + '@webassemblyjs/helper-numbers@1.13.2': + resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==} + + '@webassemblyjs/helper-wasm-bytecode@1.13.2': + resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==} + + '@webassemblyjs/helper-wasm-section@1.14.1': + resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==} + + '@webassemblyjs/ieee754@1.13.2': + resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==} + + '@webassemblyjs/leb128@1.13.2': + resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==} + + '@webassemblyjs/utf8@1.13.2': + resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==} + + '@webassemblyjs/wasm-edit@1.14.1': + resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==} + + '@webassemblyjs/wasm-gen@1.14.1': + resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==} + + '@webassemblyjs/wasm-opt@1.14.1': + resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==} + + '@webassemblyjs/wasm-parser@1.14.1': + resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==} + + '@webassemblyjs/wast-printer@1.14.1': + resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} + + '@xtuc/ieee754@1.2.0': + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + + '@xtuc/long@4.2.2': + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + + acorn-import-phases@1.0.4: + resolution: {integrity: sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==} + engines: {node: '>=10.13.0'} + peerDependencies: + acorn: ^8.14.0 + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn-walk@8.3.4: + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} + engines: {node: '>=0.4.0'} + + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + + address@1.2.2: + resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==} + engines: {node: '>= 10.0.0'} + + aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + + ajv-formats@2.1.1: + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-keywords@3.5.2: + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + + ajv-keywords@5.1.0: + resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} + peerDependencies: + ajv: ^8.8.2 + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + + algoliasearch-helper@3.26.0: + resolution: {integrity: sha512-Rv2x3GXleQ3ygwhkhJubhhYGsICmShLAiqtUuJTUkr9uOCOXyF2E71LVT4XDnVffbknv8XgScP4U0Oxtgm+hIw==} + peerDependencies: + algoliasearch: '>= 3.1 < 6' + + algoliasearch@5.33.0: + resolution: {integrity: sha512-WdgSkmyTec5n2W2FA2/7Q7TCSajCV0X6w57u3H5GHnw0UCp/G5xb33/Jx1FX3uMtz17P3wGEzMCP82d0LJqMow==} + engines: {node: '>= 14.0.0'} + + ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-html-community@0.0.8: + resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} + engines: {'0': node >= 0.8.0} + hasBin: true + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + astring@1.9.0: + resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} + hasBin: true + + autoprefixer@10.4.21: + resolution: {integrity: sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + babel-loader@9.2.1: + resolution: {integrity: sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==} + engines: {node: '>= 14.15.0'} + peerDependencies: + '@babel/core': ^7.12.0 + webpack: '>=5' + + babel-plugin-dynamic-import-node@2.3.3: + resolution: {integrity: sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==} + + babel-plugin-polyfill-corejs2@0.4.14: + resolution: {integrity: sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-corejs3@0.13.0: + resolution: {integrity: sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-regenerator@0.6.5: + resolution: {integrity: sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + batch@0.6.1: + resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} + + big.js@5.2.2: + resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + body-parser@1.20.3: + resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + bonjour-service@1.3.0: + resolution: {integrity: sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + boxen@6.2.1: + resolution: {integrity: sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + boxen@7.1.1: + resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==} + engines: {node: '>=14.16'} + + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.25.1: + resolution: {integrity: sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + bytes@3.0.0: + resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} + engines: {node: '>= 0.8'} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + cacheable-lookup@7.0.0: + resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} + engines: {node: '>=14.16'} + + cacheable-request@10.2.14: + resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==} + engines: {node: '>=14.16'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camel-case@4.1.2: + resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + camelcase@7.0.1: + resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} + engines: {node: '>=14.16'} + + caniuse-api@3.0.0: + resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} + + caniuse-lite@1.0.30001727: + resolution: {integrity: sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==} + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.4.1: + resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + + cheerio-select@2.1.0: + resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} + + cheerio@1.0.0-rc.12: + resolution: {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==} + engines: {node: '>= 6'} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chrome-trace-event@1.0.4: + resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} + engines: {node: '>=6.0'} + + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + + clean-css@5.3.3: + resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==} + engines: {node: '>= 10.0'} + + clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + + cli-boxes@3.0.0: + resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} + engines: {node: '>=10'} + + cli-table3@0.6.5: + resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==} + engines: {node: 10.* || >= 12.*} + + clone-deep@4.0.1: + resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} + engines: {node: '>=6'} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + collapse-white-space@2.1.0: + resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + colord@2.9.3: + resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + combine-promises@1.2.0: + resolution: {integrity: sha512-VcQB1ziGD0NXrhKxiwyNbCDmRzs/OShMs2GqW2DlU2A/Sd0nQxE1oWDAE5O0ygSx5mgQOn9eIFh7yKPgFRVkPQ==} + engines: {node: '>=10'} + + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + + commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + commander@5.1.0: + resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} + engines: {node: '>= 6'} + + commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + + common-path-prefix@3.0.0: + resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} + + compressible@2.0.18: + resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} + engines: {node: '>= 0.6'} + + compression@1.8.0: + resolution: {integrity: sha512-k6WLKfunuqCYD3t6AsuPGvQWaKwuLLh2/xHNcX4qE+vIfDNXpSqnrhwA7O53R7WVQUnt8dVAIW+YHr7xTgOgGA==} + engines: {node: '>= 0.8.0'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + + configstore@6.0.0: + resolution: {integrity: sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==} + engines: {node: '>=12'} + + connect-history-api-fallback@2.0.0: + resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} + engines: {node: '>=0.8'} + + consola@3.4.2: + resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} + engines: {node: ^14.18.0 || >=16.10.0} + + content-disposition@0.5.2: + resolution: {integrity: sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==} + engines: {node: '>= 0.6'} + + content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + + cookie@0.7.1: + resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} + engines: {node: '>= 0.6'} + + copy-text-to-clipboard@3.2.0: + resolution: {integrity: sha512-RnJFp1XR/LOBDckxTib5Qjr/PMfkatD0MUCQgdpqS8MdKiNUzBjAQBEN6oUy+jW7LI93BBG3DtMB2KOOKpGs2Q==} + engines: {node: '>=12'} + + copy-webpack-plugin@11.0.0: + resolution: {integrity: sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==} + engines: {node: '>= 14.15.0'} + peerDependencies: + webpack: ^5.1.0 + + core-js-compat@3.44.0: + resolution: {integrity: sha512-JepmAj2zfl6ogy34qfWtcE7nHKAJnKsQFRn++scjVS2bZFllwptzw61BZcZFYBPpUznLfAvh0LGhxKppk04ClA==} + + core-js-pure@3.44.0: + resolution: {integrity: sha512-gvMQAGB4dfVUxpYD0k3Fq8J+n5bB6Ytl15lqlZrOIXFzxOhtPaObfkQGHtMRdyjIf7z2IeNULwi1jEwyS+ltKQ==} + + core-js@3.44.0: + resolution: {integrity: sha512-aFCtd4l6GvAXwVEh3XbbVqJGHDJt0OZRa+5ePGx3LLwi12WfexqQxcsohb2wgsa/92xtl19Hd66G/L+TaAxDMw==} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + cosmiconfig@8.3.6: + resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + crypto-random-string@4.0.0: + resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} + engines: {node: '>=12'} + + css-blank-pseudo@7.0.1: + resolution: {integrity: sha512-jf+twWGDf6LDoXDUode+nc7ZlrqfaNphrBIBrcmeP3D8yw1uPaix1gCC8LUQUGQ6CycuK2opkbFFWFuq/a94ag==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + css-declaration-sorter@7.2.0: + resolution: {integrity: sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.0.9 + + css-has-pseudo@7.0.2: + resolution: {integrity: sha512-nzol/h+E0bId46Kn2dQH5VElaknX2Sr0hFuB/1EomdC7j+OISt2ZzK7EHX9DZDY53WbIVAR7FYKSO2XnSf07MQ==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + css-loader@6.11.0: + resolution: {integrity: sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==} + engines: {node: '>= 12.13.0'} + peerDependencies: + '@rspack/core': 0.x || 1.x + webpack: ^5.0.0 + peerDependenciesMeta: + '@rspack/core': + optional: true + webpack: + optional: true + + css-minimizer-webpack-plugin@5.0.1: + resolution: {integrity: sha512-3caImjKFQkS+ws1TGcFn0V1HyDJFq1Euy589JlD6/3rV2kj+w7r5G9WDMgSHvpvXHNZ2calVypZWuEDQd9wfLg==} + engines: {node: '>= 14.15.0'} + peerDependencies: + '@parcel/css': '*' + '@swc/css': '*' + clean-css: '*' + csso: '*' + esbuild: '*' + lightningcss: '*' + webpack: ^5.0.0 + peerDependenciesMeta: + '@parcel/css': + optional: true + '@swc/css': + optional: true + clean-css: + optional: true + csso: + optional: true + esbuild: + optional: true + lightningcss: + optional: true + + css-prefers-color-scheme@10.0.0: + resolution: {integrity: sha512-VCtXZAWivRglTZditUfB4StnsWr6YVZ2PRtuxQLKTNRdtAf8tpzaVPE9zXIF3VaSc7O70iK/j1+NXxyQCqdPjQ==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + css-select@4.3.0: + resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} + + css-select@5.2.2: + resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} + + css-tree@2.2.1: + resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + + css-tree@2.3.1: + resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + css-what@6.2.2: + resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} + engines: {node: '>= 6'} + + cssdb@8.3.1: + resolution: {integrity: sha512-XnDRQMXucLueX92yDe0LPKupXetWoFOgawr4O4X41l5TltgK2NVbJJVDnnOywDYfW1sTJ28AcXGKOqdRKwCcmQ==} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + cssnano-preset-advanced@6.1.2: + resolution: {integrity: sha512-Nhao7eD8ph2DoHolEzQs5CfRpiEP0xa1HBdnFZ82kvqdmbwVBUr2r1QuQ4t1pi+D1ZpqpcO4T+wy/7RxzJ/WPQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + cssnano-preset-default@6.1.2: + resolution: {integrity: sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + cssnano-utils@4.0.2: + resolution: {integrity: sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + cssnano@6.1.2: + resolution: {integrity: sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + csso@5.0.5: + resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + debounce@1.2.1: + resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.1: + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decode-named-character-reference@1.2.0: + resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==} + + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + + deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + default-gateway@6.0.3: + resolution: {integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==} + engines: {node: '>= 10'} + + defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + depd@1.1.2: + resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} + engines: {node: '>= 0.6'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + detect-node@2.1.0: + resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + + detect-port@1.6.1: + resolution: {integrity: sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q==} + engines: {node: '>= 4.0.0'} + hasBin: true + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + dns-packet@5.6.1: + resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} + engines: {node: '>=6'} + + dom-converter@0.2.0: + resolution: {integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==} + + dom-serializer@1.4.1: + resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} + + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@4.3.1: + resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} + engines: {node: '>= 4'} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@2.8.0: + resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + + domutils@3.2.2: + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + + dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + + dot-prop@6.0.1: + resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==} + engines: {node: '>=10'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + duplexer@0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + electron-to-chromium@1.5.186: + resolution: {integrity: sha512-lur7L4BFklgepaJxj4DqPk7vKbTEl0pajNlg2QjE5shefmlmBLm2HvQ7PMf1R/GvlevT/581cop33/quQcfX3A==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + emojilib@2.4.0: + resolution: {integrity: sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==} + + emojis-list@3.0.0: + resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} + engines: {node: '>= 4'} + + emoticon@4.1.0: + resolution: {integrity: sha512-VWZfnxqwNcc51hIy/sbOdEem6D+cVtpPzEEtVAFdaas30+1dgkyaOQ4sQ6Bp0tOMqWO1v+HQfYaoodOkdhK6SQ==} + + encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + enhanced-resolve@5.18.2: + resolution: {integrity: sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==} + engines: {node: '>=10.13.0'} + + entities@2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + esast-util-from-estree@2.0.0: + resolution: {integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==} + + esast-util-from-js@2.0.1: + resolution: {integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==} + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-goat@4.0.0: + resolution: {integrity: sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==} + engines: {node: '>=12'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-util-attach-comments@3.0.0: + resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==} + + estree-util-build-jsx@3.0.1: + resolution: {integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==} + + estree-util-is-identifier-name@3.0.0: + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + + estree-util-scope@1.0.0: + resolution: {integrity: sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==} + + estree-util-to-js@2.0.0: + resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==} + + estree-util-value-to-estree@3.4.0: + resolution: {integrity: sha512-Zlp+gxis+gCfK12d3Srl2PdX2ybsEA8ZYy6vQGVQTNNYLEGRQQ56XB64bjemN8kxIKXP1nC9ip4Z+ILy9LGzvQ==} + + estree-util-visit@2.0.0: + resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + eta@2.2.0: + resolution: {integrity: sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g==} + engines: {node: '>=6.0.0'} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + eval@0.1.8: + resolution: {integrity: sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==} + engines: {node: '>= 0.8'} + + eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + express@4.21.2: + resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} + engines: {node: '>= 0.10.0'} + + extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-uri@3.0.6: + resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} + + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + + fault@2.0.1: + resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} + + faye-websocket@0.11.4: + resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} + engines: {node: '>=0.8.0'} + + feed@4.2.2: + resolution: {integrity: sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==} + engines: {node: '>=0.4.0'} + + figures@3.2.0: + resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} + engines: {node: '>=8'} + + file-loader@6.2.0: + resolution: {integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==} + engines: {node: '>= 10.13.0'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + finalhandler@1.3.1: + resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} + engines: {node: '>= 0.8'} + + find-cache-dir@4.0.0: + resolution: {integrity: sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==} + engines: {node: '>=14.16'} + + find-up@6.3.0: + resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + + follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + form-data-encoder@2.1.4: + resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} + engines: {node: '>= 14.17'} + + format@0.2.2: + resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} + engines: {node: '>=0.4.x'} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + fs-extra@11.3.0: + resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==} + engines: {node: '>=14.14'} + + fs-monkey@1.0.6: + resolution: {integrity: sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-own-enumerable-property-symbols@3.0.2: + resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + github-slugger@1.5.0: + resolution: {integrity: sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + global-dirs@3.0.1: + resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} + engines: {node: '>=10'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + globby@13.2.2: + resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + got@12.6.1: + resolution: {integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==} + engines: {node: '>=14.16'} + + graceful-fs@4.2.10: + resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + gray-matter@4.0.3: + resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} + engines: {node: '>=6.0'} + + gzip-size@6.0.0: + resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} + engines: {node: '>=10'} + + handle-thing@2.0.1: + resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-yarn@3.0.0: + resolution: {integrity: sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hast-util-from-parse5@8.0.3: + resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==} + + hast-util-parse-selector@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + + hast-util-raw@9.1.0: + resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==} + + hast-util-to-estree@3.1.3: + resolution: {integrity: sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==} + + hast-util-to-jsx-runtime@2.3.6: + resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==} + + hast-util-to-parse5@8.0.0: + resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + hastscript@9.0.1: + resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + history@4.10.1: + resolution: {integrity: sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==} + + hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + + hpack.js@2.1.6: + resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} + + html-entities@2.6.0: + resolution: {integrity: sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==} + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + html-minifier-terser@6.1.0: + resolution: {integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==} + engines: {node: '>=12'} + hasBin: true + + html-minifier-terser@7.2.0: + resolution: {integrity: sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==} + engines: {node: ^14.13.1 || >=16.0.0} + hasBin: true + + html-tags@3.3.1: + resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} + engines: {node: '>=8'} + + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + + html-webpack-plugin@5.6.3: + resolution: {integrity: sha512-QSf1yjtSAsmf7rYBV7XX86uua4W/vkhIt0xNXKbsi2foEeW7vjJQz4bhnpL3xH+l1ryl1680uNv968Z+X6jSYg==} + engines: {node: '>=10.13.0'} + peerDependencies: + '@rspack/core': 0.x || 1.x + webpack: ^5.20.0 + peerDependenciesMeta: + '@rspack/core': + optional: true + webpack: + optional: true + + htmlparser2@6.1.0: + resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} + + htmlparser2@8.0.2: + resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + + http-cache-semantics@4.2.0: + resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} + + http-deceiver@1.2.7: + resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} + + http-errors@1.6.3: + resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} + engines: {node: '>= 0.6'} + + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + http-parser-js@0.5.10: + resolution: {integrity: sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==} + + http-proxy-middleware@2.0.9: + resolution: {integrity: sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/express': ^4.17.13 + peerDependenciesMeta: + '@types/express': + optional: true + + http-proxy@1.18.1: + resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} + engines: {node: '>=8.0.0'} + + http2-wrapper@2.2.1: + resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} + engines: {node: '>=10.19.0'} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + icss-utils@5.1.0: + resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + image-size@2.0.2: + resolution: {integrity: sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==} + engines: {node: '>=16.x'} + hasBin: true + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + import-lazy@4.0.0: + resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} + engines: {node: '>=8'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + infima@0.2.0-alpha.45: + resolution: {integrity: sha512-uyH0zfr1erU1OohLk0fT4Rrb94AOhguWNOcD9uGrSpRvNB+6gZXUoJX5J0NtvzBO10YZ9PgvA4NFgt+fYg8ojw==} + engines: {node: '>=12'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.3: + resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + ini@2.0.0: + resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==} + engines: {node: '>=10'} + + inline-style-parser@0.2.4: + resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==} + + invariant@2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + ipaddr.js@2.2.0: + resolution: {integrity: sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==} + engines: {node: '>= 10'} + + is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + + is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-ci@3.0.1: + resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} + hasBin: true + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + + is-installed-globally@0.4.0: + resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==} + engines: {node: '>=10'} + + is-npm@6.0.0: + resolution: {integrity: sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-obj@1.0.1: + resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} + engines: {node: '>=0.10.0'} + + is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-plain-obj@3.0.0: + resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} + engines: {node: '>=10'} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + + is-regexp@1.0.0: + resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==} + engines: {node: '>=0.10.0'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + + is-yarn-global@0.4.1: + resolution: {integrity: sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==} + engines: {node: '>=12'} + + isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + + jest-util@29.7.0: + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + + jest-worker@29.7.0: + resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jiti@1.21.7: + resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} + hasBin: true + + joi@17.13.3: + resolution: {integrity: sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsesc@3.0.2: + resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} + engines: {node: '>=6'} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + latest-version@7.0.0: + resolution: {integrity: sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==} + engines: {node: '>=14.16'} + + launch-editor@2.10.0: + resolution: {integrity: sha512-D7dBRJo/qcGX9xlvt/6wUYzQxjh5G1RvZPgPv8vi4KRU99DVQL/oW7tnVOCCTm2HGeo3C5HvGE5Yrh6UBoZ0vA==} + + leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + loader-runner@4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + + loader-utils@2.0.4: + resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} + engines: {node: '>=8.9.0'} + + locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + + lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + + lodash.uniq@4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + + lowercase-keys@3.0.0: + resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + markdown-extensions@2.0.0: + resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} + engines: {node: '>=16'} + + markdown-table@2.0.0: + resolution: {integrity: sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==} + + markdown-table@3.0.4: + resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + mdast-util-directive@3.1.0: + resolution: {integrity: sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==} + + mdast-util-find-and-replace@3.0.2: + resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} + + mdast-util-from-markdown@2.0.2: + resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} + + mdast-util-frontmatter@2.0.1: + resolution: {integrity: sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==} + + mdast-util-gfm-autolink-literal@2.0.1: + resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} + + mdast-util-gfm-footnote@2.1.0: + resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} + + mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + + mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + + mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + + mdast-util-gfm@3.1.0: + resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} + + mdast-util-mdx-expression@2.0.1: + resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} + + mdast-util-mdx-jsx@3.2.0: + resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==} + + mdast-util-mdx@3.0.0: + resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==} + + mdast-util-mdxjs-esm@2.0.1: + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-hast@13.2.0: + resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} + + mdast-util-to-markdown@2.1.2: + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + + mdn-data@2.0.28: + resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} + + mdn-data@2.0.30: + resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + + media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + + memfs@3.5.3: + resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} + engines: {node: '>= 4.0.0'} + + merge-descriptors@1.0.3: + resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + + micromark-core-commonmark@2.0.3: + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} + + micromark-extension-directive@3.0.2: + resolution: {integrity: sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==} + + micromark-extension-frontmatter@2.0.0: + resolution: {integrity: sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==} + + micromark-extension-gfm-autolink-literal@2.1.0: + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} + + micromark-extension-gfm-footnote@2.1.0: + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} + + micromark-extension-gfm-strikethrough@2.1.0: + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} + + micromark-extension-gfm-table@2.1.1: + resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==} + + micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + + micromark-extension-gfm-task-list-item@2.1.0: + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} + + micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + + micromark-extension-mdx-expression@3.0.1: + resolution: {integrity: sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==} + + micromark-extension-mdx-jsx@3.0.2: + resolution: {integrity: sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==} + + micromark-extension-mdx-md@2.0.0: + resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==} + + micromark-extension-mdxjs-esm@3.0.0: + resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==} + + micromark-extension-mdxjs@3.0.0: + resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==} + + micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + + micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + + micromark-factory-mdx-expression@2.0.3: + resolution: {integrity: sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==} + + micromark-factory-space@1.1.0: + resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==} + + micromark-factory-space@2.0.1: + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} + + micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + + micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + + micromark-util-character@1.2.0: + resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + + micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + + micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + + micromark-util-decode-string@2.0.1: + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-events-to-acorn@2.0.3: + resolution: {integrity: sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==} + + micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + + micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} + + micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} + + micromark-util-symbol@1.1.0: + resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@1.1.0: + resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==} + + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + + micromark@4.0.2: + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.33.0: + resolution: {integrity: sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==} + engines: {node: '>= 0.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + + mime-types@2.1.18: + resolution: {integrity: sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + mimic-response@4.0.0: + resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + mini-css-extract-plugin@2.9.2: + resolution: {integrity: sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w==} + engines: {node: '>= 12.13.0'} + peerDependencies: + webpack: ^5.0.0 + + minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + mrmime@2.0.1: + resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} + engines: {node: '>=10'} + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + multicast-dns@7.2.5: + resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} + hasBin: true + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + negotiator@0.6.4: + resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} + engines: {node: '>= 0.6'} + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + + node-emoji@2.2.0: + resolution: {integrity: sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==} + engines: {node: '>=18'} + + node-forge@1.3.1: + resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} + engines: {node: '>= 6.13.0'} + + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + + normalize-url@8.0.2: + resolution: {integrity: sha512-Ee/R3SyN4BuynXcnTaekmaVdbDAEiNrHqjQIA37mHU8G9pf7aaAD4ZX3XjBLo6rsdcxA/gtkcNYZLt30ACgynw==} + engines: {node: '>=14.16'} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + nprogress@0.2.0: + resolution: {integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + null-loader@4.0.1: + resolution: {integrity: sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg==} + engines: {node: '>= 10.13.0'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + + obuf@1.1.2: + resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + on-headers@1.0.2: + resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + + opener@1.5.2: + resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} + hasBin: true + + p-cancelable@3.0.0: + resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} + engines: {node: '>=12.20'} + + p-finally@1.0.0: + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} + + p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + + p-queue@6.6.2: + resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} + engines: {node: '>=8'} + + p-retry@4.6.2: + resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==} + engines: {node: '>=8'} + + p-timeout@3.2.0: + resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} + engines: {node: '>=8'} + + package-json@8.1.1: + resolution: {integrity: sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==} + engines: {node: '>=14.16'} + + param-case@3.0.4: + resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-entities@4.0.2: + resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parse-numeric-range@1.3.0: + resolution: {integrity: sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==} + + parse5-htmlparser2-tree-adapter@7.1.0: + resolution: {integrity: sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==} + + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + pascal-case@3.1.2: + resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + + path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-is-inside@1.0.2: + resolution: {integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-to-regexp@0.1.12: + resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} + + path-to-regexp@1.9.0: + resolution: {integrity: sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==} + + path-to-regexp@3.3.0: + resolution: {integrity: sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pkg-dir@7.0.0: + resolution: {integrity: sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==} + engines: {node: '>=14.16'} + + postcss-attribute-case-insensitive@7.0.1: + resolution: {integrity: sha512-Uai+SupNSqzlschRyNx3kbCTWgY/2hcwtHEI/ej2LJWc9JJ77qKgGptd8DHwY1mXtZ7Aoh4z4yxfwMBue9eNgw==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-calc@9.0.1: + resolution: {integrity: sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.2.2 + + postcss-clamp@4.1.0: + resolution: {integrity: sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==} + engines: {node: '>=7.6.0'} + peerDependencies: + postcss: ^8.4.6 + + postcss-color-functional-notation@7.0.10: + resolution: {integrity: sha512-k9qX+aXHBiLTRrWoCJuUFI6F1iF6QJQUXNVWJVSbqZgj57jDhBlOvD8gNUGl35tgqDivbGLhZeW3Ongz4feuKA==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-color-hex-alpha@10.0.0: + resolution: {integrity: sha512-1kervM2cnlgPs2a8Vt/Qbe5cQ++N7rkYo/2rz2BkqJZIHQwaVuJgQH38REHrAi4uM0b1fqxMkWYmese94iMp3w==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-color-rebeccapurple@10.0.0: + resolution: {integrity: sha512-JFta737jSP+hdAIEhk1Vs0q0YF5P8fFcj+09pweS8ktuGuZ8pPlykHsk6mPxZ8awDl4TrcxUqJo9l1IhVr/OjQ==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-colormin@6.1.0: + resolution: {integrity: sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-convert-values@6.1.0: + resolution: {integrity: sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-custom-media@11.0.6: + resolution: {integrity: sha512-C4lD4b7mUIw+RZhtY7qUbf4eADmb7Ey8BFA2px9jUbwg7pjTZDl4KY4bvlUV+/vXQvzQRfiGEVJyAbtOsCMInw==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-custom-properties@14.0.6: + resolution: {integrity: sha512-fTYSp3xuk4BUeVhxCSJdIPhDLpJfNakZKoiTDx7yRGCdlZrSJR7mWKVOBS4sBF+5poPQFMj2YdXx1VHItBGihQ==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-custom-selectors@8.0.5: + resolution: {integrity: sha512-9PGmckHQswiB2usSO6XMSswO2yFWVoCAuih1yl9FVcwkscLjRKjwsjM3t+NIWpSU2Jx3eOiK2+t4vVTQaoCHHg==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-dir-pseudo-class@9.0.1: + resolution: {integrity: sha512-tRBEK0MHYvcMUrAuYMEOa0zg9APqirBcgzi6P21OhxtJyJADo/SWBwY1CAwEohQ/6HDaa9jCjLRG7K3PVQYHEA==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-discard-comments@6.0.2: + resolution: {integrity: sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-discard-duplicates@6.0.3: + resolution: {integrity: sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-discard-empty@6.0.3: + resolution: {integrity: sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-discard-overridden@6.0.2: + resolution: {integrity: sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-discard-unused@6.0.5: + resolution: {integrity: sha512-wHalBlRHkaNnNwfC8z+ppX57VhvS+HWgjW508esjdaEYr3Mx7Gnn2xA4R/CKf5+Z9S5qsqC+Uzh4ueENWwCVUA==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-double-position-gradients@6.0.2: + resolution: {integrity: sha512-7qTqnL7nfLRyJK/AHSVrrXOuvDDzettC+wGoienURV8v2svNbu6zJC52ruZtHaO6mfcagFmuTGFdzRsJKB3k5Q==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-focus-visible@10.0.1: + resolution: {integrity: sha512-U58wyjS/I1GZgjRok33aE8juW9qQgQUNwTSdxQGuShHzwuYdcklnvK/+qOWX1Q9kr7ysbraQ6ht6r+udansalA==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-focus-within@9.0.1: + resolution: {integrity: sha512-fzNUyS1yOYa7mOjpci/bR+u+ESvdar6hk8XNK/TRR0fiGTp2QT5N+ducP0n3rfH/m9I7H/EQU6lsa2BrgxkEjw==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-font-variant@5.0.0: + resolution: {integrity: sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==} + peerDependencies: + postcss: ^8.1.0 + + postcss-gap-properties@6.0.0: + resolution: {integrity: sha512-Om0WPjEwiM9Ru+VhfEDPZJAKWUd0mV1HmNXqp2C29z80aQ2uP9UVhLc7e3aYMIor/S5cVhoPgYQ7RtfeZpYTRw==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-image-set-function@7.0.0: + resolution: {integrity: sha512-QL7W7QNlZuzOwBTeXEmbVckNt1FSmhQtbMRvGGqqU4Nf4xk6KUEQhAoWuMzwbSv5jxiRiSZ5Tv7eiDB9U87znA==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-lab-function@7.0.10: + resolution: {integrity: sha512-tqs6TCEv9tC1Riq6fOzHuHcZyhg4k3gIAMB8GGY/zA1ssGdm6puHMVE7t75aOSoFg7UD2wyrFFhbldiCMyyFTQ==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-loader@7.3.4: + resolution: {integrity: sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A==} + engines: {node: '>= 14.15.0'} + peerDependencies: + postcss: ^7.0.0 || ^8.0.1 + webpack: ^5.0.0 + + postcss-logical@8.1.0: + resolution: {integrity: sha512-pL1hXFQ2fEXNKiNiAgtfA005T9FBxky5zkX6s4GZM2D8RkVgRqz3f4g1JUoq925zXv495qk8UNldDwh8uGEDoA==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-merge-idents@6.0.3: + resolution: {integrity: sha512-1oIoAsODUs6IHQZkLQGO15uGEbK3EAl5wi9SS8hs45VgsxQfMnxvt+L+zIr7ifZFIH14cfAeVe2uCTa+SPRa3g==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-merge-longhand@6.0.5: + resolution: {integrity: sha512-5LOiordeTfi64QhICp07nzzuTDjNSO8g5Ksdibt44d+uvIIAE1oZdRn8y/W5ZtYgRH/lnLDlvi9F8btZcVzu3w==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-merge-rules@6.1.1: + resolution: {integrity: sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-minify-font-values@6.1.0: + resolution: {integrity: sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-minify-gradients@6.0.3: + resolution: {integrity: sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-minify-params@6.1.0: + resolution: {integrity: sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-minify-selectors@6.0.4: + resolution: {integrity: sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-modules-extract-imports@3.1.0: + resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-local-by-default@4.2.0: + resolution: {integrity: sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-scope@3.2.1: + resolution: {integrity: sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-values@4.0.0: + resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-nesting@13.0.2: + resolution: {integrity: sha512-1YCI290TX+VP0U/K/aFxzHzQWHWURL+CtHMSbex1lCdpXD1SoR2sYuxDu5aNI9lPoXpKTCggFZiDJbwylU0LEQ==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-normalize-charset@6.0.2: + resolution: {integrity: sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-display-values@6.0.2: + resolution: {integrity: sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-positions@6.0.2: + resolution: {integrity: sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-repeat-style@6.0.2: + resolution: {integrity: sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-string@6.0.2: + resolution: {integrity: sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-timing-functions@6.0.2: + resolution: {integrity: sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-unicode@6.1.0: + resolution: {integrity: sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-url@6.0.2: + resolution: {integrity: sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-whitespace@6.0.2: + resolution: {integrity: sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-opacity-percentage@3.0.0: + resolution: {integrity: sha512-K6HGVzyxUxd/VgZdX04DCtdwWJ4NGLG212US4/LA1TLAbHgmAsTWVR86o+gGIbFtnTkfOpb9sCRBx8K7HO66qQ==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-ordered-values@6.0.2: + resolution: {integrity: sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-overflow-shorthand@6.0.0: + resolution: {integrity: sha512-BdDl/AbVkDjoTofzDQnwDdm/Ym6oS9KgmO7Gr+LHYjNWJ6ExORe4+3pcLQsLA9gIROMkiGVjjwZNoL/mpXHd5Q==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-page-break@3.0.4: + resolution: {integrity: sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==} + peerDependencies: + postcss: ^8 + + postcss-place@10.0.0: + resolution: {integrity: sha512-5EBrMzat2pPAxQNWYavwAfoKfYcTADJ8AXGVPcUZ2UkNloUTWzJQExgrzrDkh3EKzmAx1evfTAzF9I8NGcc+qw==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-preset-env@10.2.4: + resolution: {integrity: sha512-q+lXgqmTMdB0Ty+EQ31SuodhdfZetUlwCA/F0zRcd/XdxjzI+Rl2JhZNz5US2n/7t9ePsvuhCnEN4Bmu86zXlA==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-pseudo-class-any-link@10.0.1: + resolution: {integrity: sha512-3el9rXlBOqTFaMFkWDOkHUTQekFIYnaQY55Rsp8As8QQkpiSgIYEcF/6Ond93oHiDsGb4kad8zjt+NPlOC1H0Q==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-reduce-idents@6.0.3: + resolution: {integrity: sha512-G3yCqZDpsNPoQgbDUy3T0E6hqOQ5xigUtBQyrmq3tn2GxlyiL0yyl7H+T8ulQR6kOcHJ9t7/9H4/R2tv8tJbMA==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-reduce-initial@6.1.0: + resolution: {integrity: sha512-RarLgBK/CrL1qZags04oKbVbrrVK2wcxhvta3GCxrZO4zveibqbRPmm2VI8sSgCXwoUHEliRSbOfpR0b/VIoiw==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-reduce-transforms@6.0.2: + resolution: {integrity: sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-replace-overflow-wrap@4.0.0: + resolution: {integrity: sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==} + peerDependencies: + postcss: ^8.0.3 + + postcss-selector-not@8.0.1: + resolution: {integrity: sha512-kmVy/5PYVb2UOhy0+LqUYAhKj7DUGDpSWa5LZqlkWJaaAV+dxxsOG3+St0yNLu6vsKD7Dmqx+nWQt0iil89+WA==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} + + postcss-selector-parser@7.1.0: + resolution: {integrity: sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==} + engines: {node: '>=4'} + + postcss-sort-media-queries@5.2.0: + resolution: {integrity: sha512-AZ5fDMLD8SldlAYlvi8NIqo0+Z8xnXU2ia0jxmuhxAU+Lqt9K+AlmLNJ/zWEnE9x+Zx3qL3+1K20ATgNOr3fAA==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.4.23 + + postcss-svgo@6.0.3: + resolution: {integrity: sha512-dlrahRmxP22bX6iKEjOM+c8/1p+81asjKT+V5lrgOH944ryx/OHpclnIbGsKVd3uWOXFLYJwCVf0eEkJGvO96g==} + engines: {node: ^14 || ^16 || >= 18} + peerDependencies: + postcss: ^8.4.31 + + postcss-unique-selectors@6.0.4: + resolution: {integrity: sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss-zindex@6.0.2: + resolution: {integrity: sha512-5BxW9l1evPB/4ZIc+2GobEBoKC+h8gPGCMi+jxsYvd2x0mjq7wazk6DrP71pStqxE9Foxh5TVnonbWpFZzXaYg==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + + pretty-error@4.0.0: + resolution: {integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==} + + pretty-time@1.1.0: + resolution: {integrity: sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==} + engines: {node: '>=4'} + + prism-react-renderer@2.4.1: + resolution: {integrity: sha512-ey8Ls/+Di31eqzUxC46h8MksNuGx/n0AAC8uKpwFau4RPDYLuE3EXTp8N8G2vX2N7UC/+IXeNUnlWBGGcAG+Ig==} + peerDependencies: + react: '>=16.0.0' + + prismjs@1.30.0: + resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} + engines: {node: '>=6'} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + property-information@6.5.0: + resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} + + property-information@7.1.0: + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + + proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + pupa@3.1.0: + resolution: {integrity: sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==} + engines: {node: '>=12.20'} + + qs@6.13.0: + resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} + engines: {node: '>=0.6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + range-parser@1.2.0: + resolution: {integrity: sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==} + engines: {node: '>= 0.6'} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + + rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + + react-dom@19.1.0: + resolution: {integrity: sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==} + peerDependencies: + react: ^19.1.0 + + react-fast-compare@3.2.2: + resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==} + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-json-view-lite@2.4.1: + resolution: {integrity: sha512-fwFYknRIBxjbFm0kBDrzgBy1xa5tDg2LyXXBepC5f1b+MY3BUClMCsvanMPn089JbV1Eg3nZcrp0VCuH43aXnA==} + engines: {node: '>=18'} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + + react-loadable-ssr-addon-v5-slorber@1.0.1: + resolution: {integrity: sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A==} + engines: {node: '>=10.13.0'} + peerDependencies: + react-loadable: '*' + webpack: '>=4.41.1 || 5.x' + + react-router-config@5.1.1: + resolution: {integrity: sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==} + peerDependencies: + react: '>=15' + react-router: '>=5' + + react-router-dom@5.3.4: + resolution: {integrity: sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==} + peerDependencies: + react: '>=15' + + react-router@5.3.4: + resolution: {integrity: sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==} + peerDependencies: + react: '>=15' + + react@19.1.0: + resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==} + engines: {node: '>=0.10.0'} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + recma-build-jsx@1.0.0: + resolution: {integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==} + + recma-jsx@1.0.0: + resolution: {integrity: sha512-5vwkv65qWwYxg+Atz95acp8DMu1JDSqdGkA2Of1j6rCreyFUE/gp15fC8MnGEuG1W68UKjM6x6+YTWIh7hZM/Q==} + + recma-parse@1.0.0: + resolution: {integrity: sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==} + + recma-stringify@1.0.0: + resolution: {integrity: sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==} + + regenerate-unicode-properties@10.2.0: + resolution: {integrity: sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==} + engines: {node: '>=4'} + + regenerate@1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + + regexpu-core@6.2.0: + resolution: {integrity: sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==} + engines: {node: '>=4'} + + registry-auth-token@5.1.0: + resolution: {integrity: sha512-GdekYuwLXLxMuFTwAPg5UKGLW/UXzQrZvH/Zj791BQif5T05T0RsaLfHc9q3ZOKi7n+BoprPD9mJ0O0k4xzUlw==} + engines: {node: '>=14'} + + registry-url@6.0.1: + resolution: {integrity: sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==} + engines: {node: '>=12'} + + regjsgen@0.8.0: + resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} + + regjsparser@0.12.0: + resolution: {integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==} + hasBin: true + + rehype-raw@7.0.0: + resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} + + rehype-recma@1.0.0: + resolution: {integrity: sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==} + + relateurl@0.2.7: + resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} + engines: {node: '>= 0.10'} + + remark-directive@3.0.1: + resolution: {integrity: sha512-gwglrEQEZcZYgVyG1tQuA+h58EZfq5CSULw7J90AFuCTyib1thgHPoqQ+h9iFvU6R+vnZ5oNFQR5QKgGpk741A==} + + remark-emoji@4.0.1: + resolution: {integrity: sha512-fHdvsTR1dHkWKev9eNyhTo4EFwbUvJ8ka9SgeWkMPYFX4WoI7ViVBms3PjlQYgw5TLvNQso3GUB/b/8t3yo+dg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + remark-frontmatter@5.0.0: + resolution: {integrity: sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==} + + remark-gfm@4.0.1: + resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} + + remark-mdx@3.1.0: + resolution: {integrity: sha512-Ngl/H3YXyBV9RcRNdlYsZujAmhsxwzxpDzpDEhFBVAGthS4GDgnctpDjgFl/ULx5UEDzqtW1cyBSNKqYYrqLBA==} + + remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + + remark-rehype@11.1.2: + resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==} + + remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + + renderkid@3.0.0: + resolution: {integrity: sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==} + + repeat-string@1.6.1: + resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} + engines: {node: '>=0.10'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + require-like@0.1.2: + resolution: {integrity: sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==} + + requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + + resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-pathname@3.0.0: + resolution: {integrity: sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==} + + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} + hasBin: true + + responselike@3.0.0: + resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} + engines: {node: '>=14.16'} + + retry@0.13.1: + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + rtlcss@4.3.0: + resolution: {integrity: sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig==} + engines: {node: '>=12.0.0'} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sax@1.4.1: + resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + + scheduler@0.26.0: + resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} + + schema-dts@1.1.5: + resolution: {integrity: sha512-RJr9EaCmsLzBX2NDiO5Z3ux2BVosNZN5jo0gWgsyKvxKIUL5R3swNvoorulAeL9kLB0iTSX7V6aokhla2m7xbg==} + + schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} + + schema-utils@4.3.2: + resolution: {integrity: sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==} + engines: {node: '>= 10.13.0'} + + search-insights@2.17.3: + resolution: {integrity: sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==} + + section-matter@1.0.0: + resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} + engines: {node: '>=4'} + + select-hose@2.0.0: + resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} + + selfsigned@2.4.1: + resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} + engines: {node: '>=10'} + + semver-diff@4.0.0: + resolution: {integrity: sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==} + engines: {node: '>=12'} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + engines: {node: '>=10'} + hasBin: true + + send@0.19.0: + resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} + engines: {node: '>= 0.8.0'} + + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + + serve-handler@6.1.6: + resolution: {integrity: sha512-x5RL9Y2p5+Sh3D38Fh9i/iQ5ZK+e4xuXRd/pGbM4D13tgo/MGwbttUk8emytcr1YYzBYs+apnUngBDFYfpjPuQ==} + + serve-index@1.9.1: + resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==} + engines: {node: '>= 0.8.0'} + + serve-static@1.16.2: + resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} + engines: {node: '>= 0.8.0'} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + setprototypeof@1.1.0: + resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + shallow-clone@3.0.1: + resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} + engines: {node: '>=8'} + + shallowequal@1.1.0: + resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shell-quote@1.8.3: + resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} + engines: {node: '>= 0.4'} + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + sirv@2.0.4: + resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} + engines: {node: '>= 10'} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + sitemap@7.1.2: + resolution: {integrity: sha512-ARCqzHJ0p4gWt+j7NlU5eDlIO9+Rkr/JhPFZKKQ1l5GCus7rJH4UdrlVAh0xC/gDS/Qir2UMxqYNHtsKr2rpCw==} + engines: {node: '>=12.0.0', npm: '>=5.6.0'} + hasBin: true + + skin-tone@2.0.0: + resolution: {integrity: sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==} + engines: {node: '>=8'} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slash@4.0.0: + resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} + engines: {node: '>=12'} + + snake-case@3.0.4: + resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} + + sockjs@0.3.24: + resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} + + sort-css-media-queries@2.2.0: + resolution: {integrity: sha512-0xtkGhWCC9MGt/EzgnvbbbKhqWjl1+/rncmhTh5qCpbYguXh6S/qwePfv/JQ8jePXXmqingylxoC49pCkSPIbA==} + engines: {node: '>= 6.3.0'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + + spdy-transport@3.0.0: + resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} + + spdy@4.0.2: + resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} + engines: {node: '>=6.0.0'} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + srcset@4.0.0: + resolution: {integrity: sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==} + engines: {node: '>=12'} + + statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + std-env@3.9.0: + resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + + stringify-object@3.3.0: + resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==} + engines: {node: '>=4'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-bom-string@1.0.0: + resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} + engines: {node: '>=0.10.0'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + style-to-js@1.1.17: + resolution: {integrity: sha512-xQcBGDxJb6jjFCTzvQtfiPn6YvvP2O8U1MDIPNfJQlWMYfktPy+iGsHE7cssjs7y84d9fQaK4UF3RIJaAHSoYA==} + + style-to-object@1.0.9: + resolution: {integrity: sha512-G4qppLgKu/k6FwRpHiGiKPaPTFcG3g4wNVX/Qsfu+RqQM30E7Tyu/TEgxcL9PNLF5pdRLwQdE3YKKf+KF2Dzlw==} + + stylehacks@6.1.1: + resolution: {integrity: sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + svg-parser@2.0.4: + resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==} + + svgo@3.3.2: + resolution: {integrity: sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==} + engines: {node: '>=14.0.0'} + hasBin: true + + tapable@2.2.2: + resolution: {integrity: sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==} + engines: {node: '>=6'} + + terser-webpack-plugin@5.3.14: + resolution: {integrity: sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + + terser@5.43.1: + resolution: {integrity: sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==} + engines: {node: '>=10'} + hasBin: true + + thunky@1.1.0: + resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} + + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + + tiny-warning@1.0.3: + resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} + + tinypool@1.1.1: + resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} + engines: {node: ^18.0.0 || >=20.0.0} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + totalist@3.0.1: + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + engines: {node: '>=6'} + + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + type-fest@1.4.0: + resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} + engines: {node: '>=10'} + + type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + + type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + + typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + + typescript@5.6.3: + resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} + engines: {node: '>=14.17'} + hasBin: true + + undici-types@7.8.0: + resolution: {integrity: sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==} + + unicode-canonical-property-names-ecmascript@2.0.1: + resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} + engines: {node: '>=4'} + + unicode-emoji-modifier-base@1.0.0: + resolution: {integrity: sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==} + engines: {node: '>=4'} + + unicode-match-property-ecmascript@2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + + unicode-match-property-value-ecmascript@2.2.0: + resolution: {integrity: sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==} + engines: {node: '>=4'} + + unicode-property-aliases-ecmascript@2.1.0: + resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} + engines: {node: '>=4'} + + unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + + unique-string@3.0.0: + resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==} + engines: {node: '>=12'} + + unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + + unist-util-position-from-estree@2.0.0: + resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + + unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + update-browserslist-db@1.1.3: + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + update-notifier@6.0.2: + resolution: {integrity: sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==} + engines: {node: '>=14.16'} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + url-loader@4.1.1: + resolution: {integrity: sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==} + engines: {node: '>= 10.13.0'} + peerDependencies: + file-loader: '*' + webpack: ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + file-loader: + optional: true + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + utila@0.4.0: + resolution: {integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==} + + utility-types@3.11.0: + resolution: {integrity: sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==} + engines: {node: '>= 4'} + + utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + value-equal@1.0.1: + resolution: {integrity: sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + vfile-location@5.0.3: + resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} + + vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + + watchpack@2.4.4: + resolution: {integrity: sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==} + engines: {node: '>=10.13.0'} + + wbuf@1.7.3: + resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} + + web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + + webpack-bundle-analyzer@4.10.2: + resolution: {integrity: sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw==} + engines: {node: '>= 10.13.0'} + hasBin: true + + webpack-dev-middleware@5.3.4: + resolution: {integrity: sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==} + engines: {node: '>= 12.13.0'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + + webpack-dev-server@4.15.2: + resolution: {integrity: sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==} + engines: {node: '>= 12.13.0'} + hasBin: true + peerDependencies: + webpack: ^4.37.0 || ^5.0.0 + webpack-cli: '*' + peerDependenciesMeta: + webpack: + optional: true + webpack-cli: + optional: true + + webpack-merge@5.10.0: + resolution: {integrity: sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==} + engines: {node: '>=10.0.0'} + + webpack-merge@6.0.1: + resolution: {integrity: sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==} + engines: {node: '>=18.0.0'} + + webpack-sources@3.3.3: + resolution: {integrity: sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==} + engines: {node: '>=10.13.0'} + + webpack@5.100.2: + resolution: {integrity: sha512-QaNKAvGCDRh3wW1dsDjeMdDXwZm2vqq3zn6Pvq4rHOEOGSaUMgOOjG2Y9ZbIGzpfkJk9ZYTHpDqgDfeBDcnLaw==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + + webpackbar@6.0.1: + resolution: {integrity: sha512-TnErZpmuKdwWBdMoexjio3KKX6ZtoKHRVvLIU0A47R0VVBDtx3ZyOJDktgYixhoJokZTYTt1Z37OkO9pnGJa9Q==} + engines: {node: '>=14.21.3'} + peerDependencies: + webpack: 3 || 4 || 5 + + websocket-driver@0.7.4: + resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} + engines: {node: '>=0.8.0'} + + websocket-extensions@0.1.4: + resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} + engines: {node: '>=0.8.0'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + widest-line@4.0.1: + resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} + engines: {node: '>=12'} + + wildcard@2.0.1: + resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + write-file-atomic@3.0.3: + resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + + ws@7.5.10: + resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.18.3: + resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xdg-basedir@5.1.0: + resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==} + engines: {node: '>=12'} + + xml-js@1.6.11: + resolution: {integrity: sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==} + hasBin: true + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yocto-queue@1.2.1: + resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==} + engines: {node: '>=12.20'} + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@algolia/autocomplete-core@1.17.9(@algolia/client-search@5.33.0)(algoliasearch@5.33.0)(search-insights@2.17.3)': + dependencies: + '@algolia/autocomplete-plugin-algolia-insights': 1.17.9(@algolia/client-search@5.33.0)(algoliasearch@5.33.0)(search-insights@2.17.3) + '@algolia/autocomplete-shared': 1.17.9(@algolia/client-search@5.33.0)(algoliasearch@5.33.0) + transitivePeerDependencies: + - '@algolia/client-search' + - algoliasearch + - search-insights + + '@algolia/autocomplete-plugin-algolia-insights@1.17.9(@algolia/client-search@5.33.0)(algoliasearch@5.33.0)(search-insights@2.17.3)': + dependencies: + '@algolia/autocomplete-shared': 1.17.9(@algolia/client-search@5.33.0)(algoliasearch@5.33.0) + search-insights: 2.17.3 + transitivePeerDependencies: + - '@algolia/client-search' + - algoliasearch + + '@algolia/autocomplete-preset-algolia@1.17.9(@algolia/client-search@5.33.0)(algoliasearch@5.33.0)': + dependencies: + '@algolia/autocomplete-shared': 1.17.9(@algolia/client-search@5.33.0)(algoliasearch@5.33.0) + '@algolia/client-search': 5.33.0 + algoliasearch: 5.33.0 + + '@algolia/autocomplete-shared@1.17.9(@algolia/client-search@5.33.0)(algoliasearch@5.33.0)': + dependencies: + '@algolia/client-search': 5.33.0 + algoliasearch: 5.33.0 + + '@algolia/client-abtesting@5.33.0': + dependencies: + '@algolia/client-common': 5.33.0 + '@algolia/requester-browser-xhr': 5.33.0 + '@algolia/requester-fetch': 5.33.0 + '@algolia/requester-node-http': 5.33.0 + + '@algolia/client-analytics@5.33.0': + dependencies: + '@algolia/client-common': 5.33.0 + '@algolia/requester-browser-xhr': 5.33.0 + '@algolia/requester-fetch': 5.33.0 + '@algolia/requester-node-http': 5.33.0 + + '@algolia/client-common@5.33.0': {} + + '@algolia/client-insights@5.33.0': + dependencies: + '@algolia/client-common': 5.33.0 + '@algolia/requester-browser-xhr': 5.33.0 + '@algolia/requester-fetch': 5.33.0 + '@algolia/requester-node-http': 5.33.0 + + '@algolia/client-personalization@5.33.0': + dependencies: + '@algolia/client-common': 5.33.0 + '@algolia/requester-browser-xhr': 5.33.0 + '@algolia/requester-fetch': 5.33.0 + '@algolia/requester-node-http': 5.33.0 + + '@algolia/client-query-suggestions@5.33.0': + dependencies: + '@algolia/client-common': 5.33.0 + '@algolia/requester-browser-xhr': 5.33.0 + '@algolia/requester-fetch': 5.33.0 + '@algolia/requester-node-http': 5.33.0 + + '@algolia/client-search@5.33.0': + dependencies: + '@algolia/client-common': 5.33.0 + '@algolia/requester-browser-xhr': 5.33.0 + '@algolia/requester-fetch': 5.33.0 + '@algolia/requester-node-http': 5.33.0 + + '@algolia/events@4.0.1': {} + + '@algolia/ingestion@1.33.0': + dependencies: + '@algolia/client-common': 5.33.0 + '@algolia/requester-browser-xhr': 5.33.0 + '@algolia/requester-fetch': 5.33.0 + '@algolia/requester-node-http': 5.33.0 + + '@algolia/monitoring@1.33.0': + dependencies: + '@algolia/client-common': 5.33.0 + '@algolia/requester-browser-xhr': 5.33.0 + '@algolia/requester-fetch': 5.33.0 + '@algolia/requester-node-http': 5.33.0 + + '@algolia/recommend@5.33.0': + dependencies: + '@algolia/client-common': 5.33.0 + '@algolia/requester-browser-xhr': 5.33.0 + '@algolia/requester-fetch': 5.33.0 + '@algolia/requester-node-http': 5.33.0 + + '@algolia/requester-browser-xhr@5.33.0': + dependencies: + '@algolia/client-common': 5.33.0 + + '@algolia/requester-fetch@5.33.0': + dependencies: + '@algolia/client-common': 5.33.0 + + '@algolia/requester-node-http@5.33.0': + dependencies: + '@algolia/client-common': 5.33.0 + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.12 + '@jridgewell/trace-mapping': 0.3.29 + + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.27.1 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.28.0': {} + + '@babel/core@7.28.0': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.0 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) + '@babel/helpers': 7.27.6 + '@babel/parser': 7.28.0 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.1 + convert-source-map: 2.0.0 + debug: 4.4.1 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.28.0': + dependencies: + '@babel/parser': 7.28.0 + '@babel/types': 7.28.1 + '@jridgewell/gen-mapping': 0.3.12 + '@jridgewell/trace-mapping': 0.3.29 + jsesc: 3.1.0 + + '@babel/helper-annotate-as-pure@7.27.3': + dependencies: + '@babel/types': 7.28.1 + + '@babel/helper-compilation-targets@7.27.2': + dependencies: + '@babel/compat-data': 7.28.0 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.25.1 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-create-class-features-plugin@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.0) + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/traverse': 7.28.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-create-regexp-features-plugin@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-annotate-as-pure': 7.27.3 + regexpu-core: 6.2.0 + semver: 6.3.1 + + '@babel/helper-define-polyfill-provider@0.6.5(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + debug: 4.4.1 + lodash.debounce: 4.0.8 + resolve: 1.22.10 + transitivePeerDependencies: + - supports-color + + '@babel/helper-globals@7.28.0': {} + + '@babel/helper-member-expression-to-functions@7.27.1': + dependencies: + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-imports@7.27.1': + dependencies: + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.27.3(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.28.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-optimise-call-expression@7.27.1': + dependencies: + '@babel/types': 7.28.1 + + '@babel/helper-plugin-utils@7.27.1': {} + + '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-wrap-function': 7.27.1 + '@babel/traverse': 7.28.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/traverse': 7.28.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + dependencies: + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.27.1': {} + + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helper-wrap-function@7.27.1': + dependencies: + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.1 + transitivePeerDependencies: + - supports-color + + '@babel/helpers@7.27.6': + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.28.1 + + '@babel/parser@7.28.0': + dependencies: + '@babel/types': 7.28.1 + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.28.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.28.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.28.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + + '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-async-generator-functions@7.28.0(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.0) + '@babel/traverse': 7.28.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-block-scoping@7.28.0(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-class-static-block@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-classes@7.28.0(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-globals': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.0) + '@babel/traverse': 7.28.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/template': 7.27.2 + + '@babel/plugin-transform-destructuring@7.28.0(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.28.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-dotall-regex@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-explicit-resource-management@7.28.0(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.28.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-exponentiation-operator@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.28.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-json-strings@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-literals@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-logical-assignment-operators@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-systemjs@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.28.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-numeric-separator@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-object-rest-spread@7.28.0(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.28.0) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.0) + '@babel/traverse': 7.28.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-optional-catch-binding@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-optional-chaining@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-private-property-in-object@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-react-constant-elements@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-react-display-name@7.28.0(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-react-jsx-development@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.0) + '@babel/types': 7.28.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-react-pure-annotations@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-regenerator@7.28.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-regexp-modifiers@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-runtime@7.28.0(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + babel-plugin-polyfill-corejs2: 0.4.14(@babel/core@7.28.0) + babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.28.0) + babel-plugin-polyfill-regenerator: 0.6.5(@babel/core@7.28.0) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-spread@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-typescript@7.28.0(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-property-regex@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-sets-regex@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/preset-env@7.28.0(@babel/core@7.28.0)': + dependencies: + '@babel/compat-data': 7.28.0 + '@babel/core': 7.28.0 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.0) + '@babel/plugin-syntax-import-assertions': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.28.0) + '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-async-generator-functions': 7.28.0(@babel/core@7.28.0) + '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-block-scoping': 7.28.0(@babel/core@7.28.0) + '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-class-static-block': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-classes': 7.28.0(@babel/core@7.28.0) + '@babel/plugin-transform-computed-properties': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.28.0) + '@babel/plugin-transform-dotall-regex': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-explicit-resource-management': 7.28.0(@babel/core@7.28.0) + '@babel/plugin-transform-exponentiation-operator': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-json-strings': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-logical-assignment-operators': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-modules-systemjs': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-numeric-separator': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-object-rest-spread': 7.28.0(@babel/core@7.28.0) + '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-optional-catch-binding': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.0) + '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-private-property-in-object': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-regenerator': 7.28.1(@babel/core@7.28.0) + '@babel/plugin-transform-regexp-modifiers': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-unicode-property-regex': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-unicode-sets-regex': 7.27.1(@babel/core@7.28.0) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.28.0) + babel-plugin-polyfill-corejs2: 0.4.14(@babel/core@7.28.0) + babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.28.0) + babel-plugin-polyfill-regenerator: 0.6.5(@babel/core@7.28.0) + core-js-compat: 3.44.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/types': 7.28.1 + esutils: 2.0.3 + + '@babel/preset-react@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-transform-react-display-name': 7.28.0(@babel/core@7.28.0) + '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-react-pure-annotations': 7.27.1(@babel/core@7.28.0) + transitivePeerDependencies: + - supports-color + + '@babel/preset-typescript@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.28.0) + transitivePeerDependencies: + - supports-color + + '@babel/runtime-corejs3@7.28.0': + dependencies: + core-js-pure: 3.44.0 + + '@babel/runtime@7.27.6': {} + + '@babel/template@7.27.2': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.28.0 + '@babel/types': 7.28.1 + + '@babel/traverse@7.28.0': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.0 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.0 + '@babel/template': 7.27.2 + '@babel/types': 7.28.1 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.28.1': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + + '@colors/colors@1.5.0': + optional: true + + '@csstools/cascade-layer-name-parser@2.0.5(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/color-helpers@5.0.2': {} + + '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-color-parser@3.0.10(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/color-helpers': 5.0.2 + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-tokenizer@3.0.4': {} + + '@csstools/media-query-list-parser@4.0.3(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/postcss-cascade-layers@5.0.2(postcss@8.5.6)': + dependencies: + '@csstools/selector-specificity': 5.0.0(postcss-selector-parser@7.1.0) + postcss: 8.5.6 + postcss-selector-parser: 7.1.0 + + '@csstools/postcss-color-function@4.0.10(postcss@8.5.6)': + dependencies: + '@csstools/css-color-parser': 3.0.10(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/postcss-progressive-custom-properties': 4.1.0(postcss@8.5.6) + '@csstools/utilities': 2.0.0(postcss@8.5.6) + postcss: 8.5.6 + + '@csstools/postcss-color-mix-function@3.0.10(postcss@8.5.6)': + dependencies: + '@csstools/css-color-parser': 3.0.10(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/postcss-progressive-custom-properties': 4.1.0(postcss@8.5.6) + '@csstools/utilities': 2.0.0(postcss@8.5.6) + postcss: 8.5.6 + + '@csstools/postcss-color-mix-variadic-function-arguments@1.0.0(postcss@8.5.6)': + dependencies: + '@csstools/css-color-parser': 3.0.10(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/postcss-progressive-custom-properties': 4.1.0(postcss@8.5.6) + '@csstools/utilities': 2.0.0(postcss@8.5.6) + postcss: 8.5.6 + + '@csstools/postcss-content-alt-text@2.0.6(postcss@8.5.6)': + dependencies: + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/postcss-progressive-custom-properties': 4.1.0(postcss@8.5.6) + '@csstools/utilities': 2.0.0(postcss@8.5.6) + postcss: 8.5.6 + + '@csstools/postcss-exponential-functions@2.0.9(postcss@8.5.6)': + dependencies: + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + postcss: 8.5.6 + + '@csstools/postcss-font-format-keywords@4.0.0(postcss@8.5.6)': + dependencies: + '@csstools/utilities': 2.0.0(postcss@8.5.6) + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + '@csstools/postcss-gamut-mapping@2.0.10(postcss@8.5.6)': + dependencies: + '@csstools/css-color-parser': 3.0.10(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + postcss: 8.5.6 + + '@csstools/postcss-gradients-interpolation-method@5.0.10(postcss@8.5.6)': + dependencies: + '@csstools/css-color-parser': 3.0.10(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/postcss-progressive-custom-properties': 4.1.0(postcss@8.5.6) + '@csstools/utilities': 2.0.0(postcss@8.5.6) + postcss: 8.5.6 + + '@csstools/postcss-hwb-function@4.0.10(postcss@8.5.6)': + dependencies: + '@csstools/css-color-parser': 3.0.10(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/postcss-progressive-custom-properties': 4.1.0(postcss@8.5.6) + '@csstools/utilities': 2.0.0(postcss@8.5.6) + postcss: 8.5.6 + + '@csstools/postcss-ic-unit@4.0.2(postcss@8.5.6)': + dependencies: + '@csstools/postcss-progressive-custom-properties': 4.1.0(postcss@8.5.6) + '@csstools/utilities': 2.0.0(postcss@8.5.6) + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + '@csstools/postcss-initial@2.0.1(postcss@8.5.6)': + dependencies: + postcss: 8.5.6 + + '@csstools/postcss-is-pseudo-class@5.0.3(postcss@8.5.6)': + dependencies: + '@csstools/selector-specificity': 5.0.0(postcss-selector-parser@7.1.0) + postcss: 8.5.6 + postcss-selector-parser: 7.1.0 + + '@csstools/postcss-light-dark-function@2.0.9(postcss@8.5.6)': + dependencies: + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/postcss-progressive-custom-properties': 4.1.0(postcss@8.5.6) + '@csstools/utilities': 2.0.0(postcss@8.5.6) + postcss: 8.5.6 + + '@csstools/postcss-logical-float-and-clear@3.0.0(postcss@8.5.6)': + dependencies: + postcss: 8.5.6 + + '@csstools/postcss-logical-overflow@2.0.0(postcss@8.5.6)': + dependencies: + postcss: 8.5.6 + + '@csstools/postcss-logical-overscroll-behavior@2.0.0(postcss@8.5.6)': + dependencies: + postcss: 8.5.6 + + '@csstools/postcss-logical-resize@3.0.0(postcss@8.5.6)': + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + '@csstools/postcss-logical-viewport-units@3.0.4(postcss@8.5.6)': + dependencies: + '@csstools/css-tokenizer': 3.0.4 + '@csstools/utilities': 2.0.0(postcss@8.5.6) + postcss: 8.5.6 + + '@csstools/postcss-media-minmax@2.0.9(postcss@8.5.6)': + dependencies: + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/media-query-list-parser': 4.0.3(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + postcss: 8.5.6 + + '@csstools/postcss-media-queries-aspect-ratio-number-values@3.0.5(postcss@8.5.6)': + dependencies: + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/media-query-list-parser': 4.0.3(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + postcss: 8.5.6 + + '@csstools/postcss-nested-calc@4.0.0(postcss@8.5.6)': + dependencies: + '@csstools/utilities': 2.0.0(postcss@8.5.6) + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + '@csstools/postcss-normalize-display-values@4.0.0(postcss@8.5.6)': + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + '@csstools/postcss-oklab-function@4.0.10(postcss@8.5.6)': + dependencies: + '@csstools/css-color-parser': 3.0.10(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/postcss-progressive-custom-properties': 4.1.0(postcss@8.5.6) + '@csstools/utilities': 2.0.0(postcss@8.5.6) + postcss: 8.5.6 + + '@csstools/postcss-progressive-custom-properties@4.1.0(postcss@8.5.6)': + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + '@csstools/postcss-random-function@2.0.1(postcss@8.5.6)': + dependencies: + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + postcss: 8.5.6 + + '@csstools/postcss-relative-color-syntax@3.0.10(postcss@8.5.6)': + dependencies: + '@csstools/css-color-parser': 3.0.10(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/postcss-progressive-custom-properties': 4.1.0(postcss@8.5.6) + '@csstools/utilities': 2.0.0(postcss@8.5.6) + postcss: 8.5.6 + + '@csstools/postcss-scope-pseudo-class@4.0.1(postcss@8.5.6)': + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 7.1.0 + + '@csstools/postcss-sign-functions@1.1.4(postcss@8.5.6)': + dependencies: + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + postcss: 8.5.6 + + '@csstools/postcss-stepped-value-functions@4.0.9(postcss@8.5.6)': + dependencies: + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + postcss: 8.5.6 + + '@csstools/postcss-text-decoration-shorthand@4.0.2(postcss@8.5.6)': + dependencies: + '@csstools/color-helpers': 5.0.2 + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + '@csstools/postcss-trigonometric-functions@4.0.9(postcss@8.5.6)': + dependencies: + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + postcss: 8.5.6 + + '@csstools/postcss-unset-value@4.0.0(postcss@8.5.6)': + dependencies: + postcss: 8.5.6 + + '@csstools/selector-resolve-nested@3.1.0(postcss-selector-parser@7.1.0)': + dependencies: + postcss-selector-parser: 7.1.0 + + '@csstools/selector-specificity@5.0.0(postcss-selector-parser@7.1.0)': + dependencies: + postcss-selector-parser: 7.1.0 + + '@csstools/utilities@2.0.0(postcss@8.5.6)': + dependencies: + postcss: 8.5.6 + + '@discoveryjs/json-ext@0.5.7': {} + + '@docsearch/css@3.9.0': {} + + '@docsearch/react@3.9.0(@algolia/client-search@5.33.0)(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(search-insights@2.17.3)': + dependencies: + '@algolia/autocomplete-core': 1.17.9(@algolia/client-search@5.33.0)(algoliasearch@5.33.0)(search-insights@2.17.3) + '@algolia/autocomplete-preset-algolia': 1.17.9(@algolia/client-search@5.33.0)(algoliasearch@5.33.0) + '@docsearch/css': 3.9.0 + algoliasearch: 5.33.0 + optionalDependencies: + '@types/react': 19.1.8 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + search-insights: 2.17.3 + transitivePeerDependencies: + - '@algolia/client-search' + + '@docusaurus/babel@3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/generator': 7.28.0 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.28.0) + '@babel/plugin-transform-runtime': 7.28.0(@babel/core@7.28.0) + '@babel/preset-env': 7.28.0(@babel/core@7.28.0) + '@babel/preset-react': 7.27.1(@babel/core@7.28.0) + '@babel/preset-typescript': 7.27.1(@babel/core@7.28.0) + '@babel/runtime': 7.27.6 + '@babel/runtime-corejs3': 7.28.0 + '@babel/traverse': 7.28.0 + '@docusaurus/logger': 3.8.1 + '@docusaurus/utils': 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + babel-plugin-dynamic-import-node: 2.3.3 + fs-extra: 11.3.0 + tslib: 2.8.1 + transitivePeerDependencies: + - '@swc/core' + - acorn + - esbuild + - react + - react-dom + - supports-color + - uglify-js + - webpack-cli + + '@docusaurus/bundler@3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.6.3)': + dependencies: + '@babel/core': 7.28.0 + '@docusaurus/babel': 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@docusaurus/cssnano-preset': 3.8.1 + '@docusaurus/logger': 3.8.1 + '@docusaurus/types': 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@docusaurus/utils': 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + babel-loader: 9.2.1(@babel/core@7.28.0)(webpack@5.100.2) + clean-css: 5.3.3 + copy-webpack-plugin: 11.0.0(webpack@5.100.2) + css-loader: 6.11.0(webpack@5.100.2) + css-minimizer-webpack-plugin: 5.0.1(clean-css@5.3.3)(webpack@5.100.2) + cssnano: 6.1.2(postcss@8.5.6) + file-loader: 6.2.0(webpack@5.100.2) + html-minifier-terser: 7.2.0 + mini-css-extract-plugin: 2.9.2(webpack@5.100.2) + null-loader: 4.0.1(webpack@5.100.2) + postcss: 8.5.6 + postcss-loader: 7.3.4(postcss@8.5.6)(typescript@5.6.3)(webpack@5.100.2) + postcss-preset-env: 10.2.4(postcss@8.5.6) + terser-webpack-plugin: 5.3.14(webpack@5.100.2) + tslib: 2.8.1 + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.100.2))(webpack@5.100.2) + webpack: 5.100.2 + webpackbar: 6.0.1(webpack@5.100.2) + transitivePeerDependencies: + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - acorn + - csso + - esbuild + - lightningcss + - react + - react-dom + - supports-color + - typescript + - uglify-js + - webpack-cli + + '@docusaurus/core@3.8.1(@mdx-js/react@3.1.0(@types/react@19.1.8)(react@19.1.0))(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.6.3)': + dependencies: + '@docusaurus/babel': 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@docusaurus/bundler': 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.6.3) + '@docusaurus/logger': 3.8.1 + '@docusaurus/mdx-loader': 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@docusaurus/utils': 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@docusaurus/utils-common': 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@docusaurus/utils-validation': 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@mdx-js/react': 3.1.0(@types/react@19.1.8)(react@19.1.0) + boxen: 6.2.1 + chalk: 4.1.2 + chokidar: 3.6.0 + cli-table3: 0.6.5 + combine-promises: 1.2.0 + commander: 5.1.0 + core-js: 3.44.0 + detect-port: 1.6.1 + escape-html: 1.0.3 + eta: 2.2.0 + eval: 0.1.8 + execa: 5.1.1 + fs-extra: 11.3.0 + html-tags: 3.3.1 + html-webpack-plugin: 5.6.3(webpack@5.100.2) + leven: 3.1.0 + lodash: 4.17.21 + open: 8.4.2 + p-map: 4.0.0 + prompts: 2.4.2 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + react-helmet-async: '@slorber/react-helmet-async@1.3.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)' + react-loadable: '@docusaurus/react-loadable@6.0.0(react@19.1.0)' + react-loadable-ssr-addon-v5-slorber: 1.0.1(@docusaurus/react-loadable@6.0.0(react@19.1.0))(webpack@5.100.2) + react-router: 5.3.4(react@19.1.0) + react-router-config: 5.1.1(react-router@5.3.4(react@19.1.0))(react@19.1.0) + react-router-dom: 5.3.4(react@19.1.0) + semver: 7.7.2 + serve-handler: 6.1.6 + tinypool: 1.1.1 + tslib: 2.8.1 + update-notifier: 6.0.2 + webpack: 5.100.2 + webpack-bundle-analyzer: 4.10.2 + webpack-dev-server: 4.15.2(webpack@5.100.2) + webpack-merge: 6.0.1 + transitivePeerDependencies: + - '@docusaurus/faster' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - acorn + - bufferutil + - csso + - debug + - esbuild + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - webpack-cli + + '@docusaurus/cssnano-preset@3.8.1': + dependencies: + cssnano-preset-advanced: 6.1.2(postcss@8.5.6) + postcss: 8.5.6 + postcss-sort-media-queries: 5.2.0(postcss@8.5.6) + tslib: 2.8.1 + + '@docusaurus/logger@3.8.1': + dependencies: + chalk: 4.1.2 + tslib: 2.8.1 + + '@docusaurus/mdx-loader@3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@docusaurus/logger': 3.8.1 + '@docusaurus/utils': 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@docusaurus/utils-validation': 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@mdx-js/mdx': 3.1.0(acorn@8.15.0) + '@slorber/remark-comment': 1.0.0 + escape-html: 1.0.3 + estree-util-value-to-estree: 3.4.0 + file-loader: 6.2.0(webpack@5.100.2) + fs-extra: 11.3.0 + image-size: 2.0.2 + mdast-util-mdx: 3.0.0 + mdast-util-to-string: 4.0.0 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + rehype-raw: 7.0.0 + remark-directive: 3.0.1 + remark-emoji: 4.0.1 + remark-frontmatter: 5.0.0 + remark-gfm: 4.0.1 + stringify-object: 3.3.0 + tslib: 2.8.1 + unified: 11.0.5 + unist-util-visit: 5.0.0 + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.100.2))(webpack@5.100.2) + vfile: 6.0.3 + webpack: 5.100.2 + transitivePeerDependencies: + - '@swc/core' + - acorn + - esbuild + - supports-color + - uglify-js + - webpack-cli + + '@docusaurus/module-type-aliases@3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@docusaurus/types': 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@types/history': 4.7.11 + '@types/react': 19.1.8 + '@types/react-router-config': 5.0.11 + '@types/react-router-dom': 5.3.3 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + react-helmet-async: '@slorber/react-helmet-async@1.3.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)' + react-loadable: '@docusaurus/react-loadable@6.0.0(react@19.1.0)' + transitivePeerDependencies: + - '@swc/core' + - acorn + - esbuild + - supports-color + - uglify-js + - webpack-cli + + '@docusaurus/plugin-content-blog@3.8.1(@docusaurus/plugin-content-docs@3.8.1(@mdx-js/react@3.1.0(@types/react@19.1.8)(react@19.1.0))(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.6.3))(@mdx-js/react@3.1.0(@types/react@19.1.8)(react@19.1.0))(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.6.3)': + dependencies: + '@docusaurus/core': 3.8.1(@mdx-js/react@3.1.0(@types/react@19.1.8)(react@19.1.0))(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.6.3) + '@docusaurus/logger': 3.8.1 + '@docusaurus/mdx-loader': 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@docusaurus/plugin-content-docs': 3.8.1(@mdx-js/react@3.1.0(@types/react@19.1.8)(react@19.1.0))(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.6.3) + '@docusaurus/theme-common': 3.8.1(@docusaurus/plugin-content-docs@3.8.1(@mdx-js/react@3.1.0(@types/react@19.1.8)(react@19.1.0))(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.6.3))(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@docusaurus/types': 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@docusaurus/utils': 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@docusaurus/utils-common': 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@docusaurus/utils-validation': 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + cheerio: 1.0.0-rc.12 + feed: 4.2.2 + fs-extra: 11.3.0 + lodash: 4.17.21 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + schema-dts: 1.1.5 + srcset: 4.0.0 + tslib: 2.8.1 + unist-util-visit: 5.0.0 + utility-types: 3.11.0 + webpack: 5.100.2 + transitivePeerDependencies: + - '@docusaurus/faster' + - '@mdx-js/react' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - acorn + - bufferutil + - csso + - debug + - esbuild + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - webpack-cli + + '@docusaurus/plugin-content-docs@3.8.1(@mdx-js/react@3.1.0(@types/react@19.1.8)(react@19.1.0))(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.6.3)': + dependencies: + '@docusaurus/core': 3.8.1(@mdx-js/react@3.1.0(@types/react@19.1.8)(react@19.1.0))(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.6.3) + '@docusaurus/logger': 3.8.1 + '@docusaurus/mdx-loader': 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@docusaurus/module-type-aliases': 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@docusaurus/theme-common': 3.8.1(@docusaurus/plugin-content-docs@3.8.1(@mdx-js/react@3.1.0(@types/react@19.1.8)(react@19.1.0))(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.6.3))(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@docusaurus/types': 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@docusaurus/utils': 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@docusaurus/utils-common': 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@docusaurus/utils-validation': 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@types/react-router-config': 5.0.11 + combine-promises: 1.2.0 + fs-extra: 11.3.0 + js-yaml: 4.1.0 + lodash: 4.17.21 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + schema-dts: 1.1.5 + tslib: 2.8.1 + utility-types: 3.11.0 + webpack: 5.100.2 + transitivePeerDependencies: + - '@docusaurus/faster' + - '@mdx-js/react' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - acorn + - bufferutil + - csso + - debug + - esbuild + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - webpack-cli + + '@docusaurus/plugin-content-pages@3.8.1(@mdx-js/react@3.1.0(@types/react@19.1.8)(react@19.1.0))(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.6.3)': + dependencies: + '@docusaurus/core': 3.8.1(@mdx-js/react@3.1.0(@types/react@19.1.8)(react@19.1.0))(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.6.3) + '@docusaurus/mdx-loader': 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@docusaurus/types': 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@docusaurus/utils': 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@docusaurus/utils-validation': 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + fs-extra: 11.3.0 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + tslib: 2.8.1 + webpack: 5.100.2 + transitivePeerDependencies: + - '@docusaurus/faster' + - '@mdx-js/react' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - acorn + - bufferutil + - csso + - debug + - esbuild + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - webpack-cli + + '@docusaurus/plugin-css-cascade-layers@3.8.1(@mdx-js/react@3.1.0(@types/react@19.1.8)(react@19.1.0))(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.6.3)': + dependencies: + '@docusaurus/core': 3.8.1(@mdx-js/react@3.1.0(@types/react@19.1.8)(react@19.1.0))(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.6.3) + '@docusaurus/types': 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@docusaurus/utils': 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@docusaurus/utils-validation': 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + tslib: 2.8.1 + transitivePeerDependencies: + - '@docusaurus/faster' + - '@mdx-js/react' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - acorn + - bufferutil + - csso + - debug + - esbuild + - lightningcss + - react + - react-dom + - supports-color + - typescript + - uglify-js + - utf-8-validate + - webpack-cli + + '@docusaurus/plugin-debug@3.8.1(@mdx-js/react@3.1.0(@types/react@19.1.8)(react@19.1.0))(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.6.3)': + dependencies: + '@docusaurus/core': 3.8.1(@mdx-js/react@3.1.0(@types/react@19.1.8)(react@19.1.0))(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.6.3) + '@docusaurus/types': 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@docusaurus/utils': 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + fs-extra: 11.3.0 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + react-json-view-lite: 2.4.1(react@19.1.0) + tslib: 2.8.1 + transitivePeerDependencies: + - '@docusaurus/faster' + - '@mdx-js/react' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - acorn + - bufferutil + - csso + - debug + - esbuild + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - webpack-cli + + '@docusaurus/plugin-google-analytics@3.8.1(@mdx-js/react@3.1.0(@types/react@19.1.8)(react@19.1.0))(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.6.3)': + dependencies: + '@docusaurus/core': 3.8.1(@mdx-js/react@3.1.0(@types/react@19.1.8)(react@19.1.0))(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.6.3) + '@docusaurus/types': 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@docusaurus/utils-validation': 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + tslib: 2.8.1 + transitivePeerDependencies: + - '@docusaurus/faster' + - '@mdx-js/react' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - acorn + - bufferutil + - csso + - debug + - esbuild + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - webpack-cli + + '@docusaurus/plugin-google-gtag@3.8.1(@mdx-js/react@3.1.0(@types/react@19.1.8)(react@19.1.0))(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.6.3)': + dependencies: + '@docusaurus/core': 3.8.1(@mdx-js/react@3.1.0(@types/react@19.1.8)(react@19.1.0))(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.6.3) + '@docusaurus/types': 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@docusaurus/utils-validation': 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@types/gtag.js': 0.0.12 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + tslib: 2.8.1 + transitivePeerDependencies: + - '@docusaurus/faster' + - '@mdx-js/react' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - acorn + - bufferutil + - csso + - debug + - esbuild + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - webpack-cli + + '@docusaurus/plugin-google-tag-manager@3.8.1(@mdx-js/react@3.1.0(@types/react@19.1.8)(react@19.1.0))(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.6.3)': + dependencies: + '@docusaurus/core': 3.8.1(@mdx-js/react@3.1.0(@types/react@19.1.8)(react@19.1.0))(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.6.3) + '@docusaurus/types': 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@docusaurus/utils-validation': 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + tslib: 2.8.1 + transitivePeerDependencies: + - '@docusaurus/faster' + - '@mdx-js/react' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - acorn + - bufferutil + - csso + - debug + - esbuild + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - webpack-cli + + '@docusaurus/plugin-sitemap@3.8.1(@mdx-js/react@3.1.0(@types/react@19.1.8)(react@19.1.0))(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.6.3)': + dependencies: + '@docusaurus/core': 3.8.1(@mdx-js/react@3.1.0(@types/react@19.1.8)(react@19.1.0))(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.6.3) + '@docusaurus/logger': 3.8.1 + '@docusaurus/types': 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@docusaurus/utils': 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@docusaurus/utils-common': 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@docusaurus/utils-validation': 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + fs-extra: 11.3.0 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + sitemap: 7.1.2 + tslib: 2.8.1 + transitivePeerDependencies: + - '@docusaurus/faster' + - '@mdx-js/react' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - acorn + - bufferutil + - csso + - debug + - esbuild + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - webpack-cli + + '@docusaurus/plugin-svgr@3.8.1(@mdx-js/react@3.1.0(@types/react@19.1.8)(react@19.1.0))(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.6.3)': + dependencies: + '@docusaurus/core': 3.8.1(@mdx-js/react@3.1.0(@types/react@19.1.8)(react@19.1.0))(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.6.3) + '@docusaurus/types': 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@docusaurus/utils': 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@docusaurus/utils-validation': 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@svgr/core': 8.1.0(typescript@5.6.3) + '@svgr/webpack': 8.1.0(typescript@5.6.3) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + tslib: 2.8.1 + webpack: 5.100.2 + transitivePeerDependencies: + - '@docusaurus/faster' + - '@mdx-js/react' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - acorn + - bufferutil + - csso + - debug + - esbuild + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - webpack-cli + + '@docusaurus/preset-classic@3.8.1(@algolia/client-search@5.33.0)(@mdx-js/react@3.1.0(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(search-insights@2.17.3)(typescript@5.6.3)': + dependencies: + '@docusaurus/core': 3.8.1(@mdx-js/react@3.1.0(@types/react@19.1.8)(react@19.1.0))(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.6.3) + '@docusaurus/plugin-content-blog': 3.8.1(@docusaurus/plugin-content-docs@3.8.1(@mdx-js/react@3.1.0(@types/react@19.1.8)(react@19.1.0))(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.6.3))(@mdx-js/react@3.1.0(@types/react@19.1.8)(react@19.1.0))(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.6.3) + '@docusaurus/plugin-content-docs': 3.8.1(@mdx-js/react@3.1.0(@types/react@19.1.8)(react@19.1.0))(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.6.3) + '@docusaurus/plugin-content-pages': 3.8.1(@mdx-js/react@3.1.0(@types/react@19.1.8)(react@19.1.0))(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.6.3) + '@docusaurus/plugin-css-cascade-layers': 3.8.1(@mdx-js/react@3.1.0(@types/react@19.1.8)(react@19.1.0))(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.6.3) + '@docusaurus/plugin-debug': 3.8.1(@mdx-js/react@3.1.0(@types/react@19.1.8)(react@19.1.0))(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.6.3) + '@docusaurus/plugin-google-analytics': 3.8.1(@mdx-js/react@3.1.0(@types/react@19.1.8)(react@19.1.0))(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.6.3) + '@docusaurus/plugin-google-gtag': 3.8.1(@mdx-js/react@3.1.0(@types/react@19.1.8)(react@19.1.0))(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.6.3) + '@docusaurus/plugin-google-tag-manager': 3.8.1(@mdx-js/react@3.1.0(@types/react@19.1.8)(react@19.1.0))(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.6.3) + '@docusaurus/plugin-sitemap': 3.8.1(@mdx-js/react@3.1.0(@types/react@19.1.8)(react@19.1.0))(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.6.3) + '@docusaurus/plugin-svgr': 3.8.1(@mdx-js/react@3.1.0(@types/react@19.1.8)(react@19.1.0))(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.6.3) + '@docusaurus/theme-classic': 3.8.1(@types/react@19.1.8)(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.6.3) + '@docusaurus/theme-common': 3.8.1(@docusaurus/plugin-content-docs@3.8.1(@mdx-js/react@3.1.0(@types/react@19.1.8)(react@19.1.0))(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.6.3))(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@docusaurus/theme-search-algolia': 3.8.1(@algolia/client-search@5.33.0)(@mdx-js/react@3.1.0(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(search-insights@2.17.3)(typescript@5.6.3) + '@docusaurus/types': 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + transitivePeerDependencies: + - '@algolia/client-search' + - '@docusaurus/faster' + - '@mdx-js/react' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - '@types/react' + - acorn + - bufferutil + - csso + - debug + - esbuild + - lightningcss + - search-insights + - supports-color + - typescript + - uglify-js + - utf-8-validate + - webpack-cli + + '@docusaurus/react-loadable@6.0.0(react@19.1.0)': + dependencies: + '@types/react': 19.1.8 + react: 19.1.0 + + '@docusaurus/theme-classic@3.8.1(@types/react@19.1.8)(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.6.3)': + dependencies: + '@docusaurus/core': 3.8.1(@mdx-js/react@3.1.0(@types/react@19.1.8)(react@19.1.0))(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.6.3) + '@docusaurus/logger': 3.8.1 + '@docusaurus/mdx-loader': 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@docusaurus/module-type-aliases': 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@docusaurus/plugin-content-blog': 3.8.1(@docusaurus/plugin-content-docs@3.8.1(@mdx-js/react@3.1.0(@types/react@19.1.8)(react@19.1.0))(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.6.3))(@mdx-js/react@3.1.0(@types/react@19.1.8)(react@19.1.0))(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.6.3) + '@docusaurus/plugin-content-docs': 3.8.1(@mdx-js/react@3.1.0(@types/react@19.1.8)(react@19.1.0))(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.6.3) + '@docusaurus/plugin-content-pages': 3.8.1(@mdx-js/react@3.1.0(@types/react@19.1.8)(react@19.1.0))(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.6.3) + '@docusaurus/theme-common': 3.8.1(@docusaurus/plugin-content-docs@3.8.1(@mdx-js/react@3.1.0(@types/react@19.1.8)(react@19.1.0))(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.6.3))(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@docusaurus/theme-translations': 3.8.1 + '@docusaurus/types': 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@docusaurus/utils': 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@docusaurus/utils-common': 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@docusaurus/utils-validation': 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@mdx-js/react': 3.1.0(@types/react@19.1.8)(react@19.1.0) + clsx: 2.1.1 + copy-text-to-clipboard: 3.2.0 + infima: 0.2.0-alpha.45 + lodash: 4.17.21 + nprogress: 0.2.0 + postcss: 8.5.6 + prism-react-renderer: 2.4.1(react@19.1.0) + prismjs: 1.30.0 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + react-router-dom: 5.3.4(react@19.1.0) + rtlcss: 4.3.0 + tslib: 2.8.1 + utility-types: 3.11.0 + transitivePeerDependencies: + - '@docusaurus/faster' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - '@types/react' + - acorn + - bufferutil + - csso + - debug + - esbuild + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - webpack-cli + + '@docusaurus/theme-common@3.8.1(@docusaurus/plugin-content-docs@3.8.1(@mdx-js/react@3.1.0(@types/react@19.1.8)(react@19.1.0))(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.6.3))(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@docusaurus/mdx-loader': 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@docusaurus/module-type-aliases': 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@docusaurus/plugin-content-docs': 3.8.1(@mdx-js/react@3.1.0(@types/react@19.1.8)(react@19.1.0))(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.6.3) + '@docusaurus/utils': 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@docusaurus/utils-common': 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@types/history': 4.7.11 + '@types/react': 19.1.8 + '@types/react-router-config': 5.0.11 + clsx: 2.1.1 + parse-numeric-range: 1.3.0 + prism-react-renderer: 2.4.1(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + tslib: 2.8.1 + utility-types: 3.11.0 + transitivePeerDependencies: + - '@swc/core' + - acorn + - esbuild + - supports-color + - uglify-js + - webpack-cli + + '@docusaurus/theme-search-algolia@3.8.1(@algolia/client-search@5.33.0)(@mdx-js/react@3.1.0(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(search-insights@2.17.3)(typescript@5.6.3)': + dependencies: + '@docsearch/react': 3.9.0(@algolia/client-search@5.33.0)(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(search-insights@2.17.3) + '@docusaurus/core': 3.8.1(@mdx-js/react@3.1.0(@types/react@19.1.8)(react@19.1.0))(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.6.3) + '@docusaurus/logger': 3.8.1 + '@docusaurus/plugin-content-docs': 3.8.1(@mdx-js/react@3.1.0(@types/react@19.1.8)(react@19.1.0))(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.6.3) + '@docusaurus/theme-common': 3.8.1(@docusaurus/plugin-content-docs@3.8.1(@mdx-js/react@3.1.0(@types/react@19.1.8)(react@19.1.0))(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.6.3))(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@docusaurus/theme-translations': 3.8.1 + '@docusaurus/utils': 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@docusaurus/utils-validation': 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + algoliasearch: 5.33.0 + algoliasearch-helper: 3.26.0(algoliasearch@5.33.0) + clsx: 2.1.1 + eta: 2.2.0 + fs-extra: 11.3.0 + lodash: 4.17.21 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + tslib: 2.8.1 + utility-types: 3.11.0 + transitivePeerDependencies: + - '@algolia/client-search' + - '@docusaurus/faster' + - '@mdx-js/react' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - '@types/react' + - acorn + - bufferutil + - csso + - debug + - esbuild + - lightningcss + - search-insights + - supports-color + - typescript + - uglify-js + - utf-8-validate + - webpack-cli + + '@docusaurus/theme-translations@3.8.1': + dependencies: + fs-extra: 11.3.0 + tslib: 2.8.1 + + '@docusaurus/tsconfig@3.8.1': {} + + '@docusaurus/types@3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@mdx-js/mdx': 3.1.0(acorn@8.15.0) + '@types/history': 4.7.11 + '@types/react': 19.1.8 + commander: 5.1.0 + joi: 17.13.3 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + react-helmet-async: '@slorber/react-helmet-async@1.3.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)' + utility-types: 3.11.0 + webpack: 5.100.2 + webpack-merge: 5.10.0 + transitivePeerDependencies: + - '@swc/core' + - acorn + - esbuild + - supports-color + - uglify-js + - webpack-cli + + '@docusaurus/utils-common@3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@docusaurus/types': 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + tslib: 2.8.1 + transitivePeerDependencies: + - '@swc/core' + - acorn + - esbuild + - react + - react-dom + - supports-color + - uglify-js + - webpack-cli + + '@docusaurus/utils-validation@3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@docusaurus/logger': 3.8.1 + '@docusaurus/utils': 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@docusaurus/utils-common': 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + fs-extra: 11.3.0 + joi: 17.13.3 + js-yaml: 4.1.0 + lodash: 4.17.21 + tslib: 2.8.1 + transitivePeerDependencies: + - '@swc/core' + - acorn + - esbuild + - react + - react-dom + - supports-color + - uglify-js + - webpack-cli + + '@docusaurus/utils@3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@docusaurus/logger': 3.8.1 + '@docusaurus/types': 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@docusaurus/utils-common': 3.8.1(acorn@8.15.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + escape-string-regexp: 4.0.0 + execa: 5.1.1 + file-loader: 6.2.0(webpack@5.100.2) + fs-extra: 11.3.0 + github-slugger: 1.5.0 + globby: 11.1.0 + gray-matter: 4.0.3 + jiti: 1.21.7 + js-yaml: 4.1.0 + lodash: 4.17.21 + micromatch: 4.0.8 + p-queue: 6.6.2 + prompts: 2.4.2 + resolve-pathname: 3.0.0 + tslib: 2.8.1 + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.100.2))(webpack@5.100.2) + utility-types: 3.11.0 + webpack: 5.100.2 + transitivePeerDependencies: + - '@swc/core' + - acorn + - esbuild + - react + - react-dom + - supports-color + - uglify-js + - webpack-cli + + '@hapi/hoek@9.3.0': {} + + '@hapi/topo@5.1.0': + dependencies: + '@hapi/hoek': 9.3.0 + + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.8 + + '@jest/types@29.6.3': + dependencies: + '@jest/schemas': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 24.0.14 + '@types/yargs': 17.0.33 + chalk: 4.1.2 + + '@jridgewell/gen-mapping@0.3.12': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.4 + '@jridgewell/trace-mapping': 0.3.29 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/source-map@0.3.10': + dependencies: + '@jridgewell/gen-mapping': 0.3.12 + '@jridgewell/trace-mapping': 0.3.29 + + '@jridgewell/sourcemap-codec@1.5.4': {} + + '@jridgewell/trace-mapping@0.3.29': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.4 + + '@leichtgewicht/ip-codec@2.0.5': {} + + '@mdx-js/mdx@3.1.0(acorn@8.15.0)': + dependencies: + '@types/estree': 1.0.8 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdx': 2.0.13 + collapse-white-space: 2.1.0 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + estree-util-scope: 1.0.0 + estree-walker: 3.0.3 + hast-util-to-jsx-runtime: 2.3.6 + markdown-extensions: 2.0.0 + recma-build-jsx: 1.0.0 + recma-jsx: 1.0.0(acorn@8.15.0) + recma-stringify: 1.0.0 + rehype-recma: 1.0.0 + remark-mdx: 3.1.0 + remark-parse: 11.0.0 + remark-rehype: 11.1.2 + source-map: 0.7.4 + unified: 11.0.5 + unist-util-position-from-estree: 2.0.0 + unist-util-stringify-position: 4.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + transitivePeerDependencies: + - acorn + - supports-color + + '@mdx-js/react@3.1.0(@types/react@19.1.8)(react@19.1.0)': + dependencies: + '@types/mdx': 2.0.13 + '@types/react': 19.1.8 + react: 19.1.0 + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.1 + + '@pnpm/config.env-replace@1.1.0': {} + + '@pnpm/network.ca-file@1.0.2': + dependencies: + graceful-fs: 4.2.10 + + '@pnpm/npm-conf@2.3.1': + dependencies: + '@pnpm/config.env-replace': 1.1.0 + '@pnpm/network.ca-file': 1.0.2 + config-chain: 1.1.13 + + '@polka/url@1.0.0-next.29': {} + + '@sideway/address@4.1.5': + dependencies: + '@hapi/hoek': 9.3.0 + + '@sideway/formula@3.0.1': {} + + '@sideway/pinpoint@2.0.0': {} + + '@sinclair/typebox@0.27.8': {} + + '@sindresorhus/is@4.6.0': {} + + '@sindresorhus/is@5.6.0': {} + + '@slorber/react-helmet-async@1.3.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@babel/runtime': 7.27.6 + invariant: 2.2.4 + prop-types: 15.8.1 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + react-fast-compare: 3.2.2 + shallowequal: 1.1.0 + + '@slorber/remark-comment@1.0.0': + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + + '@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + + '@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + + '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + + '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + + '@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + + '@svgr/babel-plugin-svg-em-dimensions@8.0.0(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + + '@svgr/babel-plugin-transform-react-native-svg@8.1.0(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + + '@svgr/babel-plugin-transform-svg-component@8.0.0(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + + '@svgr/babel-preset@8.1.0(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@svgr/babel-plugin-add-jsx-attribute': 8.0.0(@babel/core@7.28.0) + '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.28.0) + '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.28.0) + '@svgr/babel-plugin-replace-jsx-attribute-value': 8.0.0(@babel/core@7.28.0) + '@svgr/babel-plugin-svg-dynamic-title': 8.0.0(@babel/core@7.28.0) + '@svgr/babel-plugin-svg-em-dimensions': 8.0.0(@babel/core@7.28.0) + '@svgr/babel-plugin-transform-react-native-svg': 8.1.0(@babel/core@7.28.0) + '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.28.0) + + '@svgr/core@8.1.0(typescript@5.6.3)': + dependencies: + '@babel/core': 7.28.0 + '@svgr/babel-preset': 8.1.0(@babel/core@7.28.0) + camelcase: 6.3.0 + cosmiconfig: 8.3.6(typescript@5.6.3) + snake-case: 3.0.4 + transitivePeerDependencies: + - supports-color + - typescript + + '@svgr/hast-util-to-babel-ast@8.0.0': + dependencies: + '@babel/types': 7.28.1 + entities: 4.5.0 + + '@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0(typescript@5.6.3))': + dependencies: + '@babel/core': 7.28.0 + '@svgr/babel-preset': 8.1.0(@babel/core@7.28.0) + '@svgr/core': 8.1.0(typescript@5.6.3) + '@svgr/hast-util-to-babel-ast': 8.0.0 + svg-parser: 2.0.4 + transitivePeerDependencies: + - supports-color + + '@svgr/plugin-svgo@8.1.0(@svgr/core@8.1.0(typescript@5.6.3))(typescript@5.6.3)': + dependencies: + '@svgr/core': 8.1.0(typescript@5.6.3) + cosmiconfig: 8.3.6(typescript@5.6.3) + deepmerge: 4.3.1 + svgo: 3.3.2 + transitivePeerDependencies: + - typescript + + '@svgr/webpack@8.1.0(typescript@5.6.3)': + dependencies: + '@babel/core': 7.28.0 + '@babel/plugin-transform-react-constant-elements': 7.27.1(@babel/core@7.28.0) + '@babel/preset-env': 7.28.0(@babel/core@7.28.0) + '@babel/preset-react': 7.27.1(@babel/core@7.28.0) + '@babel/preset-typescript': 7.27.1(@babel/core@7.28.0) + '@svgr/core': 8.1.0(typescript@5.6.3) + '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.6.3)) + '@svgr/plugin-svgo': 8.1.0(@svgr/core@8.1.0(typescript@5.6.3))(typescript@5.6.3) + transitivePeerDependencies: + - supports-color + - typescript + + '@szmarczak/http-timer@5.0.1': + dependencies: + defer-to-connect: 2.0.1 + + '@trysound/sax@0.2.0': {} + + '@types/body-parser@1.19.6': + dependencies: + '@types/connect': 3.4.38 + '@types/node': 24.0.14 + + '@types/bonjour@3.5.13': + dependencies: + '@types/node': 24.0.14 + + '@types/connect-history-api-fallback@1.5.4': + dependencies: + '@types/express-serve-static-core': 5.0.7 + '@types/node': 24.0.14 + + '@types/connect@3.4.38': + dependencies: + '@types/node': 24.0.14 + + '@types/debug@4.1.12': + dependencies: + '@types/ms': 2.1.0 + + '@types/eslint-scope@3.7.7': + dependencies: + '@types/eslint': 9.6.1 + '@types/estree': 1.0.8 + + '@types/eslint@9.6.1': + dependencies: + '@types/estree': 1.0.8 + '@types/json-schema': 7.0.15 + + '@types/estree-jsx@1.0.5': + dependencies: + '@types/estree': 1.0.8 + + '@types/estree@1.0.8': {} + + '@types/express-serve-static-core@4.19.6': + dependencies: + '@types/node': 24.0.14 + '@types/qs': 6.14.0 + '@types/range-parser': 1.2.7 + '@types/send': 0.17.5 + + '@types/express-serve-static-core@5.0.7': + dependencies: + '@types/node': 24.0.14 + '@types/qs': 6.14.0 + '@types/range-parser': 1.2.7 + '@types/send': 0.17.5 + + '@types/express@4.17.23': + dependencies: + '@types/body-parser': 1.19.6 + '@types/express-serve-static-core': 4.19.6 + '@types/qs': 6.14.0 + '@types/serve-static': 1.15.8 + + '@types/gtag.js@0.0.12': {} + + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/history@4.7.11': {} + + '@types/html-minifier-terser@6.1.0': {} + + '@types/http-cache-semantics@4.0.4': {} + + '@types/http-errors@2.0.5': {} + + '@types/http-proxy@1.17.16': + dependencies: + '@types/node': 24.0.14 + + '@types/istanbul-lib-coverage@2.0.6': {} + + '@types/istanbul-lib-report@3.0.3': + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + + '@types/istanbul-reports@3.0.4': + dependencies: + '@types/istanbul-lib-report': 3.0.3 + + '@types/json-schema@7.0.15': {} + + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/mdx@2.0.13': {} + + '@types/mime@1.3.5': {} + + '@types/ms@2.1.0': {} + + '@types/node-forge@1.3.13': + dependencies: + '@types/node': 24.0.14 + + '@types/node@17.0.45': {} + + '@types/node@24.0.14': + dependencies: + undici-types: 7.8.0 + + '@types/prismjs@1.26.5': {} + + '@types/qs@6.14.0': {} + + '@types/range-parser@1.2.7': {} + + '@types/react-router-config@5.0.11': + dependencies: + '@types/history': 4.7.11 + '@types/react': 19.1.8 + '@types/react-router': 5.1.20 + + '@types/react-router-dom@5.3.3': + dependencies: + '@types/history': 4.7.11 + '@types/react': 19.1.8 + '@types/react-router': 5.1.20 + + '@types/react-router@5.1.20': + dependencies: + '@types/history': 4.7.11 + '@types/react': 19.1.8 + + '@types/react@19.1.8': + dependencies: + csstype: 3.1.3 + + '@types/retry@0.12.0': {} + + '@types/sax@1.2.7': + dependencies: + '@types/node': 17.0.45 + + '@types/send@0.17.5': + dependencies: + '@types/mime': 1.3.5 + '@types/node': 24.0.14 + + '@types/serve-index@1.9.4': + dependencies: + '@types/express': 4.17.23 + + '@types/serve-static@1.15.8': + dependencies: + '@types/http-errors': 2.0.5 + '@types/node': 24.0.14 + '@types/send': 0.17.5 + + '@types/sockjs@0.3.36': + dependencies: + '@types/node': 24.0.14 + + '@types/unist@2.0.11': {} + + '@types/unist@3.0.3': {} + + '@types/ws@8.18.1': + dependencies: + '@types/node': 24.0.14 + + '@types/yargs-parser@21.0.3': {} + + '@types/yargs@17.0.33': + dependencies: + '@types/yargs-parser': 21.0.3 + + '@ungap/structured-clone@1.3.0': {} + + '@webassemblyjs/ast@1.14.1': + dependencies: + '@webassemblyjs/helper-numbers': 1.13.2 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + + '@webassemblyjs/floating-point-hex-parser@1.13.2': {} + + '@webassemblyjs/helper-api-error@1.13.2': {} + + '@webassemblyjs/helper-buffer@1.14.1': {} + + '@webassemblyjs/helper-numbers@1.13.2': + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.13.2 + '@webassemblyjs/helper-api-error': 1.13.2 + '@xtuc/long': 4.2.2 + + '@webassemblyjs/helper-wasm-bytecode@1.13.2': {} + + '@webassemblyjs/helper-wasm-section@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/wasm-gen': 1.14.1 + + '@webassemblyjs/ieee754@1.13.2': + dependencies: + '@xtuc/ieee754': 1.2.0 + + '@webassemblyjs/leb128@1.13.2': + dependencies: + '@xtuc/long': 4.2.2 + + '@webassemblyjs/utf8@1.13.2': {} + + '@webassemblyjs/wasm-edit@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/helper-wasm-section': 1.14.1 + '@webassemblyjs/wasm-gen': 1.14.1 + '@webassemblyjs/wasm-opt': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + '@webassemblyjs/wast-printer': 1.14.1 + + '@webassemblyjs/wasm-gen@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/ieee754': 1.13.2 + '@webassemblyjs/leb128': 1.13.2 + '@webassemblyjs/utf8': 1.13.2 + + '@webassemblyjs/wasm-opt@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/wasm-gen': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + + '@webassemblyjs/wasm-parser@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-api-error': 1.13.2 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/ieee754': 1.13.2 + '@webassemblyjs/leb128': 1.13.2 + '@webassemblyjs/utf8': 1.13.2 + + '@webassemblyjs/wast-printer@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@xtuc/long': 4.2.2 + + '@xtuc/ieee754@1.2.0': {} + + '@xtuc/long@4.2.2': {} + + accepts@1.3.8: + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + + acorn-import-phases@1.0.4(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + + acorn-jsx@5.3.2(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + + acorn-walk@8.3.4: + dependencies: + acorn: 8.15.0 + + acorn@8.15.0: {} + + address@1.2.2: {} + + aggregate-error@3.1.0: + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + + ajv-formats@2.1.1(ajv@8.17.1): + optionalDependencies: + ajv: 8.17.1 + + ajv-keywords@3.5.2(ajv@6.12.6): + dependencies: + ajv: 6.12.6 + + ajv-keywords@5.1.0(ajv@8.17.1): + dependencies: + ajv: 8.17.1 + fast-deep-equal: 3.1.3 + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.0.6 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + algoliasearch-helper@3.26.0(algoliasearch@5.33.0): + dependencies: + '@algolia/events': 4.0.1 + algoliasearch: 5.33.0 + + algoliasearch@5.33.0: + dependencies: + '@algolia/client-abtesting': 5.33.0 + '@algolia/client-analytics': 5.33.0 + '@algolia/client-common': 5.33.0 + '@algolia/client-insights': 5.33.0 + '@algolia/client-personalization': 5.33.0 + '@algolia/client-query-suggestions': 5.33.0 + '@algolia/client-search': 5.33.0 + '@algolia/ingestion': 1.33.0 + '@algolia/monitoring': 1.33.0 + '@algolia/recommend': 5.33.0 + '@algolia/requester-browser-xhr': 5.33.0 + '@algolia/requester-fetch': 5.33.0 + '@algolia/requester-node-http': 5.33.0 + + ansi-align@3.0.1: + dependencies: + string-width: 4.2.3 + + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + + ansi-html-community@0.0.8: {} + + ansi-regex@5.0.1: {} + + ansi-regex@6.1.0: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.1: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + arg@5.0.2: {} + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + argparse@2.0.1: {} + + array-flatten@1.1.1: {} + + array-union@2.1.0: {} + + astring@1.9.0: {} + + autoprefixer@10.4.21(postcss@8.5.6): + dependencies: + browserslist: 4.25.1 + caniuse-lite: 1.0.30001727 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.1.1 + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + babel-loader@9.2.1(@babel/core@7.28.0)(webpack@5.100.2): + dependencies: + '@babel/core': 7.28.0 + find-cache-dir: 4.0.0 + schema-utils: 4.3.2 + webpack: 5.100.2 + + babel-plugin-dynamic-import-node@2.3.3: + dependencies: + object.assign: 4.1.7 + + babel-plugin-polyfill-corejs2@0.4.14(@babel/core@7.28.0): + dependencies: + '@babel/compat-data': 7.28.0 + '@babel/core': 7.28.0 + '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.0) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.28.0): + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.0) + core-js-compat: 3.44.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-regenerator@0.6.5(@babel/core@7.28.0): + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.0) + transitivePeerDependencies: + - supports-color + + bail@2.0.2: {} + + balanced-match@1.0.2: {} + + batch@0.6.1: {} + + big.js@5.2.2: {} + + binary-extensions@2.3.0: {} + + 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 + transitivePeerDependencies: + - supports-color + + bonjour-service@1.3.0: + dependencies: + fast-deep-equal: 3.1.3 + multicast-dns: 7.2.5 + + boolbase@1.0.0: {} + + boxen@6.2.1: + dependencies: + ansi-align: 3.0.1 + camelcase: 6.3.0 + chalk: 4.1.2 + cli-boxes: 3.0.0 + string-width: 5.1.2 + type-fest: 2.19.0 + widest-line: 4.0.1 + wrap-ansi: 8.1.0 + + boxen@7.1.1: + dependencies: + ansi-align: 3.0.1 + camelcase: 7.0.1 + chalk: 5.4.1 + cli-boxes: 3.0.0 + string-width: 5.1.2 + type-fest: 2.19.0 + widest-line: 4.0.1 + wrap-ansi: 8.1.0 + + brace-expansion@1.1.12: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.25.1: + dependencies: + caniuse-lite: 1.0.30001727 + electron-to-chromium: 1.5.186 + node-releases: 2.0.19 + update-browserslist-db: 1.1.3(browserslist@4.25.1) + + buffer-from@1.1.2: {} + + bytes@3.0.0: {} + + bytes@3.1.2: {} + + cacheable-lookup@7.0.0: {} + + cacheable-request@10.2.14: + dependencies: + '@types/http-cache-semantics': 4.0.4 + get-stream: 6.0.1 + http-cache-semantics: 4.2.0 + keyv: 4.5.4 + mimic-response: 4.0.0 + normalize-url: 8.0.2 + responselike: 3.0.0 + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + callsites@3.1.0: {} + + camel-case@4.1.2: + dependencies: + pascal-case: 3.1.2 + tslib: 2.8.1 + + camelcase@6.3.0: {} + + camelcase@7.0.1: {} + + caniuse-api@3.0.0: + dependencies: + browserslist: 4.25.1 + caniuse-lite: 1.0.30001727 + lodash.memoize: 4.1.2 + lodash.uniq: 4.5.0 + + caniuse-lite@1.0.30001727: {} + + ccount@2.0.1: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chalk@5.4.1: {} + + char-regex@1.0.2: {} + + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + character-entities@2.0.2: {} + + character-reference-invalid@2.0.1: {} + + cheerio-select@2.1.0: + dependencies: + boolbase: 1.0.0 + css-select: 5.2.2 + css-what: 6.2.2 + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 + + cheerio@1.0.0-rc.12: + dependencies: + cheerio-select: 2.1.0 + dom-serializer: 2.0.0 + domhandler: 5.0.3 + domutils: 3.2.2 + htmlparser2: 8.0.2 + parse5: 7.3.0 + parse5-htmlparser2-tree-adapter: 7.1.0 + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chrome-trace-event@1.0.4: {} + + ci-info@3.9.0: {} + + clean-css@5.3.3: + dependencies: + source-map: 0.6.1 + + clean-stack@2.2.0: {} + + cli-boxes@3.0.0: {} + + cli-table3@0.6.5: + dependencies: + string-width: 4.2.3 + optionalDependencies: + '@colors/colors': 1.5.0 + + clone-deep@4.0.1: + dependencies: + is-plain-object: 2.0.4 + kind-of: 6.0.3 + shallow-clone: 3.0.1 + + clsx@2.1.1: {} + + collapse-white-space@2.1.0: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + colord@2.9.3: {} + + colorette@2.0.20: {} + + combine-promises@1.2.0: {} + + comma-separated-tokens@2.0.3: {} + + commander@10.0.1: {} + + commander@2.20.3: {} + + commander@5.1.0: {} + + commander@7.2.0: {} + + commander@8.3.0: {} + + common-path-prefix@3.0.0: {} + + compressible@2.0.18: + dependencies: + mime-db: 1.54.0 + + compression@1.8.0: + dependencies: + bytes: 3.1.2 + compressible: 2.0.18 + debug: 2.6.9 + negotiator: 0.6.4 + on-headers: 1.0.2 + safe-buffer: 5.2.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + concat-map@0.0.1: {} + + config-chain@1.1.13: + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + + configstore@6.0.0: + dependencies: + dot-prop: 6.0.1 + graceful-fs: 4.2.11 + unique-string: 3.0.0 + write-file-atomic: 3.0.3 + xdg-basedir: 5.1.0 + + connect-history-api-fallback@2.0.0: {} + + consola@3.4.2: {} + + content-disposition@0.5.2: {} + + content-disposition@0.5.4: + dependencies: + safe-buffer: 5.2.1 + + content-type@1.0.5: {} + + convert-source-map@2.0.0: {} + + cookie-signature@1.0.6: {} + + cookie@0.7.1: {} + + copy-text-to-clipboard@3.2.0: {} + + copy-webpack-plugin@11.0.0(webpack@5.100.2): + dependencies: + fast-glob: 3.3.3 + glob-parent: 6.0.2 + globby: 13.2.2 + normalize-path: 3.0.0 + schema-utils: 4.3.2 + serialize-javascript: 6.0.2 + webpack: 5.100.2 + + core-js-compat@3.44.0: + dependencies: + browserslist: 4.25.1 + + core-js-pure@3.44.0: {} + + core-js@3.44.0: {} + + core-util-is@1.0.3: {} + + cosmiconfig@8.3.6(typescript@5.6.3): + dependencies: + import-fresh: 3.3.1 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + optionalDependencies: + typescript: 5.6.3 + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + crypto-random-string@4.0.0: + dependencies: + type-fest: 1.4.0 + + css-blank-pseudo@7.0.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 7.1.0 + + css-declaration-sorter@7.2.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + css-has-pseudo@7.0.2(postcss@8.5.6): + dependencies: + '@csstools/selector-specificity': 5.0.0(postcss-selector-parser@7.1.0) + postcss: 8.5.6 + postcss-selector-parser: 7.1.0 + postcss-value-parser: 4.2.0 + + css-loader@6.11.0(webpack@5.100.2): + dependencies: + icss-utils: 5.1.0(postcss@8.5.6) + postcss: 8.5.6 + postcss-modules-extract-imports: 3.1.0(postcss@8.5.6) + postcss-modules-local-by-default: 4.2.0(postcss@8.5.6) + postcss-modules-scope: 3.2.1(postcss@8.5.6) + postcss-modules-values: 4.0.0(postcss@8.5.6) + postcss-value-parser: 4.2.0 + semver: 7.7.2 + optionalDependencies: + webpack: 5.100.2 + + css-minimizer-webpack-plugin@5.0.1(clean-css@5.3.3)(webpack@5.100.2): + dependencies: + '@jridgewell/trace-mapping': 0.3.29 + cssnano: 6.1.2(postcss@8.5.6) + jest-worker: 29.7.0 + postcss: 8.5.6 + schema-utils: 4.3.2 + serialize-javascript: 6.0.2 + webpack: 5.100.2 + optionalDependencies: + clean-css: 5.3.3 + + css-prefers-color-scheme@10.0.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + css-select@4.3.0: + dependencies: + boolbase: 1.0.0 + css-what: 6.2.2 + domhandler: 4.3.1 + domutils: 2.8.0 + nth-check: 2.1.1 + + css-select@5.2.2: + dependencies: + boolbase: 1.0.0 + css-what: 6.2.2 + domhandler: 5.0.3 + domutils: 3.2.2 + nth-check: 2.1.1 + + css-tree@2.2.1: + dependencies: + mdn-data: 2.0.28 + source-map-js: 1.2.1 + + css-tree@2.3.1: + dependencies: + mdn-data: 2.0.30 + source-map-js: 1.2.1 + + css-what@6.2.2: {} + + cssdb@8.3.1: {} + + cssesc@3.0.0: {} + + cssnano-preset-advanced@6.1.2(postcss@8.5.6): + dependencies: + autoprefixer: 10.4.21(postcss@8.5.6) + browserslist: 4.25.1 + cssnano-preset-default: 6.1.2(postcss@8.5.6) + postcss: 8.5.6 + postcss-discard-unused: 6.0.5(postcss@8.5.6) + postcss-merge-idents: 6.0.3(postcss@8.5.6) + postcss-reduce-idents: 6.0.3(postcss@8.5.6) + postcss-zindex: 6.0.2(postcss@8.5.6) + + cssnano-preset-default@6.1.2(postcss@8.5.6): + dependencies: + browserslist: 4.25.1 + css-declaration-sorter: 7.2.0(postcss@8.5.6) + cssnano-utils: 4.0.2(postcss@8.5.6) + postcss: 8.5.6 + postcss-calc: 9.0.1(postcss@8.5.6) + postcss-colormin: 6.1.0(postcss@8.5.6) + postcss-convert-values: 6.1.0(postcss@8.5.6) + postcss-discard-comments: 6.0.2(postcss@8.5.6) + postcss-discard-duplicates: 6.0.3(postcss@8.5.6) + postcss-discard-empty: 6.0.3(postcss@8.5.6) + postcss-discard-overridden: 6.0.2(postcss@8.5.6) + postcss-merge-longhand: 6.0.5(postcss@8.5.6) + postcss-merge-rules: 6.1.1(postcss@8.5.6) + postcss-minify-font-values: 6.1.0(postcss@8.5.6) + postcss-minify-gradients: 6.0.3(postcss@8.5.6) + postcss-minify-params: 6.1.0(postcss@8.5.6) + postcss-minify-selectors: 6.0.4(postcss@8.5.6) + postcss-normalize-charset: 6.0.2(postcss@8.5.6) + postcss-normalize-display-values: 6.0.2(postcss@8.5.6) + postcss-normalize-positions: 6.0.2(postcss@8.5.6) + postcss-normalize-repeat-style: 6.0.2(postcss@8.5.6) + postcss-normalize-string: 6.0.2(postcss@8.5.6) + postcss-normalize-timing-functions: 6.0.2(postcss@8.5.6) + postcss-normalize-unicode: 6.1.0(postcss@8.5.6) + postcss-normalize-url: 6.0.2(postcss@8.5.6) + postcss-normalize-whitespace: 6.0.2(postcss@8.5.6) + postcss-ordered-values: 6.0.2(postcss@8.5.6) + postcss-reduce-initial: 6.1.0(postcss@8.5.6) + postcss-reduce-transforms: 6.0.2(postcss@8.5.6) + postcss-svgo: 6.0.3(postcss@8.5.6) + postcss-unique-selectors: 6.0.4(postcss@8.5.6) + + cssnano-utils@4.0.2(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + cssnano@6.1.2(postcss@8.5.6): + dependencies: + cssnano-preset-default: 6.1.2(postcss@8.5.6) + lilconfig: 3.1.3 + postcss: 8.5.6 + + csso@5.0.5: + dependencies: + css-tree: 2.2.1 + + csstype@3.1.3: {} + + debounce@1.2.1: {} + + debug@2.6.9: + dependencies: + ms: 2.0.0 + + debug@4.4.1: + dependencies: + ms: 2.1.3 + + decode-named-character-reference@1.2.0: + dependencies: + character-entities: 2.0.2 + + decompress-response@6.0.0: + dependencies: + mimic-response: 3.1.0 + + deep-extend@0.6.0: {} + + deepmerge@4.3.1: {} + + default-gateway@6.0.3: + dependencies: + execa: 5.1.1 + + defer-to-connect@2.0.1: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-lazy-prop@2.0.0: {} + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + depd@1.1.2: {} + + depd@2.0.0: {} + + dequal@2.0.3: {} + + destroy@1.2.0: {} + + detect-node@2.1.0: {} + + detect-port@1.6.1: + dependencies: + address: 1.2.2 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + dns-packet@5.6.1: + dependencies: + '@leichtgewicht/ip-codec': 2.0.5 + + dom-converter@0.2.0: + dependencies: + utila: 0.4.0 + + dom-serializer@1.4.1: + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + entities: 2.2.0 + + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + domelementtype@2.3.0: {} + + domhandler@4.3.1: + dependencies: + domelementtype: 2.3.0 + + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + + domutils@2.8.0: + dependencies: + dom-serializer: 1.4.1 + domelementtype: 2.3.0 + domhandler: 4.3.1 + + domutils@3.2.2: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + + dot-case@3.0.4: + dependencies: + no-case: 3.0.4 + tslib: 2.8.1 + + dot-prop@6.0.1: + dependencies: + is-obj: 2.0.0 + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + duplexer@0.1.2: {} + + eastasianwidth@0.2.0: {} + + ee-first@1.1.1: {} + + electron-to-chromium@1.5.186: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + emojilib@2.4.0: {} + + emojis-list@3.0.0: {} + + emoticon@4.1.0: {} + + encodeurl@1.0.2: {} + + encodeurl@2.0.0: {} + + enhanced-resolve@5.18.2: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.2 + + entities@2.2.0: {} + + entities@4.5.0: {} + + entities@6.0.1: {} + + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-module-lexer@1.7.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + esast-util-from-estree@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + unist-util-position-from-estree: 2.0.0 + + esast-util-from-js@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + acorn: 8.15.0 + esast-util-from-estree: 2.0.0 + vfile-message: 4.0.2 + + escalade@3.2.0: {} + + escape-goat@4.0.0: {} + + escape-html@1.0.3: {} + + escape-string-regexp@1.0.5: {} + + escape-string-regexp@4.0.0: {} + + escape-string-regexp@5.0.0: {} + + eslint-scope@5.1.1: + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + + esprima@4.0.1: {} + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@4.3.0: {} + + estraverse@5.3.0: {} + + estree-util-attach-comments@3.0.0: + dependencies: + '@types/estree': 1.0.8 + + estree-util-build-jsx@3.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + estree-walker: 3.0.3 + + estree-util-is-identifier-name@3.0.0: {} + + estree-util-scope@1.0.0: + dependencies: + '@types/estree': 1.0.8 + devlop: 1.1.0 + + estree-util-to-js@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + astring: 1.9.0 + source-map: 0.7.4 + + estree-util-value-to-estree@3.4.0: + dependencies: + '@types/estree': 1.0.8 + + estree-util-visit@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/unist': 3.0.3 + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.8 + + esutils@2.0.3: {} + + eta@2.2.0: {} + + etag@1.8.1: {} + + eval@0.1.8: + dependencies: + '@types/node': 24.0.14 + require-like: 0.1.2 + + eventemitter3@4.0.7: {} + + events@3.3.0: {} + + execa@5.1.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + 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.5 + 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 + transitivePeerDependencies: + - supports-color + + extend-shallow@2.0.1: + dependencies: + is-extendable: 0.1.1 + + extend@3.0.2: {} + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-stable-stringify@2.1.0: {} + + fast-uri@3.0.6: {} + + fastq@1.19.1: + dependencies: + reusify: 1.1.0 + + fault@2.0.1: + dependencies: + format: 0.2.2 + + faye-websocket@0.11.4: + dependencies: + websocket-driver: 0.7.4 + + feed@4.2.2: + dependencies: + xml-js: 1.6.11 + + figures@3.2.0: + dependencies: + escape-string-regexp: 1.0.5 + + file-loader@6.2.0(webpack@5.100.2): + dependencies: + loader-utils: 2.0.4 + schema-utils: 3.3.0 + webpack: 5.100.2 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + 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 + transitivePeerDependencies: + - supports-color + + find-cache-dir@4.0.0: + dependencies: + common-path-prefix: 3.0.0 + pkg-dir: 7.0.0 + + find-up@6.3.0: + dependencies: + locate-path: 7.2.0 + path-exists: 5.0.0 + + flat@5.0.2: {} + + follow-redirects@1.15.9: {} + + form-data-encoder@2.1.4: {} + + format@0.2.2: {} + + forwarded@0.2.0: {} + + fraction.js@4.3.7: {} + + fresh@0.5.2: {} + + fs-extra@11.3.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fs-monkey@1.0.6: {} + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + gensync@1.0.0-beta.2: {} + + 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 + + get-own-enumerable-property-symbols@3.0.2: {} + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-stream@6.0.1: {} + + github-slugger@1.5.0: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob-to-regexp@0.4.1: {} + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + global-dirs@3.0.1: + dependencies: + ini: 2.0.0 + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + + globby@13.2.2: + dependencies: + dir-glob: 3.0.1 + fast-glob: 3.3.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 4.0.0 + + gopd@1.2.0: {} + + got@12.6.1: + dependencies: + '@sindresorhus/is': 5.6.0 + '@szmarczak/http-timer': 5.0.1 + cacheable-lookup: 7.0.0 + cacheable-request: 10.2.14 + decompress-response: 6.0.0 + form-data-encoder: 2.1.4 + get-stream: 6.0.1 + http2-wrapper: 2.2.1 + lowercase-keys: 3.0.0 + p-cancelable: 3.0.0 + responselike: 3.0.0 + + graceful-fs@4.2.10: {} + + graceful-fs@4.2.11: {} + + gray-matter@4.0.3: + dependencies: + js-yaml: 3.14.1 + kind-of: 6.0.3 + section-matter: 1.0.0 + strip-bom-string: 1.0.0 + + gzip-size@6.0.0: + dependencies: + duplexer: 0.1.2 + + handle-thing@2.0.1: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-symbols@1.1.0: {} + + has-yarn@3.0.0: {} + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hast-util-from-parse5@8.0.3: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + devlop: 1.1.0 + hastscript: 9.0.1 + property-information: 7.1.0 + vfile: 6.0.3 + vfile-location: 5.0.3 + web-namespaces: 2.0.1 + + hast-util-parse-selector@4.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-raw@9.1.0: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + '@ungap/structured-clone': 1.3.0 + hast-util-from-parse5: 8.0.3 + hast-util-to-parse5: 8.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + parse5: 7.3.0 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-to-estree@3.1.3: + dependencies: + '@types/estree': 1.0.8 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-attach-comments: 3.0.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + style-to-js: 1.1.17 + unist-util-position: 5.0.0 + zwitch: 2.0.4 + transitivePeerDependencies: + - supports-color + + hast-util-to-jsx-runtime@2.3.6: + dependencies: + '@types/estree': 1.0.8 + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + style-to-js: 1.1.17 + unist-util-position: 5.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + + hast-util-to-parse5@8.0.0: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hastscript@9.0.1: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + + he@1.2.0: {} + + history@4.10.1: + dependencies: + '@babel/runtime': 7.27.6 + loose-envify: 1.4.0 + resolve-pathname: 3.0.0 + tiny-invariant: 1.3.3 + tiny-warning: 1.0.3 + value-equal: 1.0.1 + + hoist-non-react-statics@3.3.2: + dependencies: + react-is: 16.13.1 + + hpack.js@2.1.6: + dependencies: + inherits: 2.0.4 + obuf: 1.1.2 + readable-stream: 2.3.8 + wbuf: 1.7.3 + + html-entities@2.6.0: {} + + html-escaper@2.0.2: {} + + html-minifier-terser@6.1.0: + dependencies: + camel-case: 4.1.2 + clean-css: 5.3.3 + commander: 8.3.0 + he: 1.2.0 + param-case: 3.0.4 + relateurl: 0.2.7 + terser: 5.43.1 + + html-minifier-terser@7.2.0: + dependencies: + camel-case: 4.1.2 + clean-css: 5.3.3 + commander: 10.0.1 + entities: 4.5.0 + param-case: 3.0.4 + relateurl: 0.2.7 + terser: 5.43.1 + + html-tags@3.3.1: {} + + html-void-elements@3.0.0: {} + + html-webpack-plugin@5.6.3(webpack@5.100.2): + dependencies: + '@types/html-minifier-terser': 6.1.0 + html-minifier-terser: 6.1.0 + lodash: 4.17.21 + pretty-error: 4.0.0 + tapable: 2.2.2 + optionalDependencies: + webpack: 5.100.2 + + htmlparser2@6.1.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + domutils: 2.8.0 + entities: 2.2.0 + + htmlparser2@8.0.2: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 + entities: 4.5.0 + + http-cache-semantics@4.2.0: {} + + http-deceiver@1.2.7: {} + + http-errors@1.6.3: + dependencies: + depd: 1.1.2 + inherits: 2.0.3 + setprototypeof: 1.1.0 + statuses: 1.5.0 + + 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 + + http-parser-js@0.5.10: {} + + http-proxy-middleware@2.0.9(@types/express@4.17.23): + dependencies: + '@types/http-proxy': 1.17.16 + http-proxy: 1.18.1 + is-glob: 4.0.3 + is-plain-obj: 3.0.0 + micromatch: 4.0.8 + optionalDependencies: + '@types/express': 4.17.23 + transitivePeerDependencies: + - debug + + http-proxy@1.18.1: + dependencies: + eventemitter3: 4.0.7 + follow-redirects: 1.15.9 + requires-port: 1.0.0 + transitivePeerDependencies: + - debug + + http2-wrapper@2.2.1: + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + + human-signals@2.1.0: {} + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + icss-utils@5.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + ignore@5.3.2: {} + + image-size@2.0.2: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + import-lazy@4.0.0: {} + + imurmurhash@0.1.4: {} + + indent-string@4.0.0: {} + + infima@0.2.0-alpha.45: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.3: {} + + inherits@2.0.4: {} + + ini@1.3.8: {} + + ini@2.0.0: {} + + inline-style-parser@0.2.4: {} + + invariant@2.2.4: + dependencies: + loose-envify: 1.4.0 + + ipaddr.js@1.9.1: {} + + ipaddr.js@2.2.0: {} + + is-alphabetical@2.0.1: {} + + is-alphanumerical@2.0.1: + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + + is-arrayish@0.2.1: {} + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-ci@3.0.1: + dependencies: + ci-info: 3.9.0 + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-decimal@2.0.1: {} + + is-docker@2.2.1: {} + + is-extendable@0.1.1: {} + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-hexadecimal@2.0.1: {} + + is-installed-globally@0.4.0: + dependencies: + global-dirs: 3.0.1 + is-path-inside: 3.0.3 + + is-npm@6.0.0: {} + + is-number@7.0.0: {} + + is-obj@1.0.1: {} + + is-obj@2.0.0: {} + + is-path-inside@3.0.3: {} + + is-plain-obj@3.0.0: {} + + is-plain-obj@4.1.0: {} + + is-plain-object@2.0.4: + dependencies: + isobject: 3.0.1 + + is-regexp@1.0.0: {} + + is-stream@2.0.1: {} + + is-typedarray@1.0.0: {} + + is-wsl@2.2.0: + dependencies: + is-docker: 2.2.1 + + is-yarn-global@0.4.1: {} + + isarray@0.0.1: {} + + isarray@1.0.0: {} + + isexe@2.0.0: {} + + isobject@3.0.1: {} + + jest-util@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/node': 24.0.14 + chalk: 4.1.2 + ci-info: 3.9.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 + + jest-worker@27.5.1: + dependencies: + '@types/node': 24.0.14 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + jest-worker@29.7.0: + dependencies: + '@types/node': 24.0.14 + jest-util: 29.7.0 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + jiti@1.21.7: {} + + 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 + + js-tokens@4.0.0: {} + + js-yaml@3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsesc@3.0.2: {} + + jsesc@3.1.0: {} + + json-buffer@3.0.1: {} + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@0.4.1: {} + + json-schema-traverse@1.0.0: {} + + json5@2.2.3: {} + + jsonfile@6.1.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + kind-of@6.0.3: {} + + kleur@3.0.3: {} + + latest-version@7.0.0: + dependencies: + package-json: 8.1.1 + + launch-editor@2.10.0: + dependencies: + picocolors: 1.1.1 + shell-quote: 1.8.3 + + leven@3.1.0: {} + + lilconfig@3.1.3: {} + + lines-and-columns@1.2.4: {} + + loader-runner@4.3.0: {} + + loader-utils@2.0.4: + dependencies: + big.js: 5.2.2 + emojis-list: 3.0.0 + json5: 2.2.3 + + locate-path@7.2.0: + dependencies: + p-locate: 6.0.0 + + lodash.debounce@4.0.8: {} + + lodash.memoize@4.1.2: {} + + lodash.uniq@4.5.0: {} + + lodash@4.17.21: {} + + longest-streak@3.1.0: {} + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + lower-case@2.0.2: + dependencies: + tslib: 2.8.1 + + lowercase-keys@3.0.0: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + markdown-extensions@2.0.0: {} + + markdown-table@2.0.0: + dependencies: + repeat-string: 1.6.1 + + markdown-table@3.0.4: {} + + math-intrinsics@1.1.0: {} + + mdast-util-directive@3.1.0: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + parse-entities: 4.0.2 + stringify-entities: 4.0.4 + unist-util-visit-parents: 6.0.1 + transitivePeerDependencies: + - supports-color + + mdast-util-find-and-replace@3.0.2: + dependencies: + '@types/mdast': 4.0.4 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + mdast-util-from-markdown@2.0.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.2.0 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.2 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-frontmatter@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + escape-string-regexp: 5.0.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + micromark-extension-frontmatter: 2.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-autolink-literal@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.2 + micromark-util-character: 2.1.1 + + mdast-util-gfm-footnote@2.1.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + micromark-util-normalize-identifier: 2.0.1 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-strikethrough@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-table@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + markdown-table: 3.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-task-list-item@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm@3.1.0: + dependencies: + mdast-util-from-markdown: 2.0.2 + mdast-util-gfm-autolink-literal: 2.0.1 + mdast-util-gfm-footnote: 2.1.0 + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-expression@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-jsx@3.2.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + parse-entities: 4.0.2 + stringify-entities: 4.0.4 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx@3.0.0: + dependencies: + mdast-util-from-markdown: 2.0.2 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdxjs-esm@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@4.1.0: + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.0 + + mdast-util-to-hast@13.2.0: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.3.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + + mdast-util-to-markdown@2.1.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-classify-character: 2.0.1 + micromark-util-decode-string: 2.0.1 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + + mdast-util-to-string@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + + mdn-data@2.0.28: {} + + mdn-data@2.0.30: {} + + media-typer@0.3.0: {} + + memfs@3.5.3: + dependencies: + fs-monkey: 1.0.6 + + merge-descriptors@1.0.3: {} + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + methods@1.1.2: {} + + micromark-core-commonmark@2.0.3: + dependencies: + decode-named-character-reference: 1.2.0 + devlop: 1.1.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-directive@3.0.2: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + parse-entities: 4.0.2 + + micromark-extension-frontmatter@2.0.0: + dependencies: + fault: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-autolink-literal@2.1.0: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-footnote@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-strikethrough@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-table@2.1.1: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-tagfilter@2.0.0: + dependencies: + micromark-util-types: 2.0.2 + + micromark-extension-gfm-task-list-item@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm@3.0.0: + dependencies: + micromark-extension-gfm-autolink-literal: 2.1.0 + micromark-extension-gfm-footnote: 2.1.0 + micromark-extension-gfm-strikethrough: 2.1.0 + micromark-extension-gfm-table: 2.1.1 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.1.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-mdx-expression@3.0.1: + dependencies: + '@types/estree': 1.0.8 + devlop: 1.1.0 + micromark-factory-mdx-expression: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-mdx-jsx@3.0.2: + dependencies: + '@types/estree': 1.0.8 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + micromark-factory-mdx-expression: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + vfile-message: 4.0.2 + + micromark-extension-mdx-md@2.0.0: + dependencies: + micromark-util-types: 2.0.2 + + micromark-extension-mdxjs-esm@3.0.0: + dependencies: + '@types/estree': 1.0.8 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.2 + + micromark-extension-mdxjs@3.0.0: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + micromark-extension-mdx-expression: 3.0.1 + micromark-extension-mdx-jsx: 3.0.2 + micromark-extension-mdx-md: 2.0.0 + micromark-extension-mdxjs-esm: 3.0.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-destination@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-label@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-mdx-expression@2.0.3: + dependencies: + '@types/estree': 1.0.8 + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.2 + + micromark-factory-space@1.1.0: + dependencies: + micromark-util-character: 1.2.0 + micromark-util-types: 1.1.0 + + micromark-factory-space@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.2 + + micromark-factory-title@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-whitespace@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-character@1.2.0: + dependencies: + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-chunked@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-classify-character@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-combine-extensions@2.0.1: + dependencies: + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-decode-numeric-character-reference@2.0.2: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-decode-string@2.0.1: + dependencies: + decode-named-character-reference: 1.2.0 + micromark-util-character: 2.1.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.1 + + micromark-util-encode@2.0.1: {} + + micromark-util-events-to-acorn@2.0.3: + dependencies: + '@types/estree': 1.0.8 + '@types/unist': 3.0.3 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + vfile-message: 4.0.2 + + micromark-util-html-tag-name@2.0.1: {} + + micromark-util-normalize-identifier@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-resolve-all@2.0.1: + dependencies: + micromark-util-types: 2.0.2 + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-subtokenize@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-symbol@1.1.0: {} + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@1.1.0: {} + + micromark-util-types@2.0.2: {} + + micromark@4.0.2: + dependencies: + '@types/debug': 4.1.12 + debug: 4.4.1 + decode-named-character-reference: 1.2.0 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + transitivePeerDependencies: + - supports-color + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.33.0: {} + + mime-db@1.52.0: {} + + mime-db@1.54.0: {} + + mime-types@2.1.18: + dependencies: + mime-db: 1.33.0 + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime@1.6.0: {} + + mimic-fn@2.1.0: {} + + mimic-response@3.1.0: {} + + mimic-response@4.0.0: {} + + mini-css-extract-plugin@2.9.2(webpack@5.100.2): + dependencies: + schema-utils: 4.3.2 + tapable: 2.2.2 + webpack: 5.100.2 + + minimalistic-assert@1.0.1: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.12 + + minimist@1.2.8: {} + + mrmime@2.0.1: {} + + ms@2.0.0: {} + + ms@2.1.3: {} + + multicast-dns@7.2.5: + dependencies: + dns-packet: 5.6.1 + thunky: 1.1.0 + + nanoid@3.3.11: {} + + negotiator@0.6.3: {} + + negotiator@0.6.4: {} + + neo-async@2.6.2: {} + + no-case@3.0.4: + dependencies: + lower-case: 2.0.2 + tslib: 2.8.1 + + node-emoji@2.2.0: + dependencies: + '@sindresorhus/is': 4.6.0 + char-regex: 1.0.2 + emojilib: 2.4.0 + skin-tone: 2.0.0 + + node-forge@1.3.1: {} + + node-releases@2.0.19: {} + + normalize-path@3.0.0: {} + + normalize-range@0.1.2: {} + + normalize-url@8.0.2: {} + + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + + nprogress@0.2.0: {} + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + null-loader@4.0.1(webpack@5.100.2): + dependencies: + loader-utils: 2.0.4 + schema-utils: 3.3.0 + webpack: 5.100.2 + + object-assign@4.1.1: {} + + object-inspect@1.13.4: {} + + object-keys@1.1.1: {} + + object.assign@4.1.7: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 + object-keys: 1.1.1 + + obuf@1.1.2: {} + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + on-headers@1.0.2: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + open@8.4.2: + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + + opener@1.5.2: {} + + p-cancelable@3.0.0: {} + + p-finally@1.0.0: {} + + p-limit@4.0.0: + dependencies: + yocto-queue: 1.2.1 + + p-locate@6.0.0: + dependencies: + p-limit: 4.0.0 + + p-map@4.0.0: + dependencies: + aggregate-error: 3.1.0 + + p-queue@6.6.2: + dependencies: + eventemitter3: 4.0.7 + p-timeout: 3.2.0 + + p-retry@4.6.2: + dependencies: + '@types/retry': 0.12.0 + retry: 0.13.1 + + p-timeout@3.2.0: + dependencies: + p-finally: 1.0.0 + + package-json@8.1.1: + dependencies: + got: 12.6.1 + registry-auth-token: 5.1.0 + registry-url: 6.0.1 + semver: 7.7.2 + + param-case@3.0.4: + dependencies: + dot-case: 3.0.4 + tslib: 2.8.1 + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-entities@4.0.2: + dependencies: + '@types/unist': 2.0.11 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.2.0 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.27.1 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + parse-numeric-range@1.3.0: {} + + parse5-htmlparser2-tree-adapter@7.1.0: + dependencies: + domhandler: 5.0.3 + parse5: 7.3.0 + + parse5@7.3.0: + dependencies: + entities: 6.0.1 + + parseurl@1.3.3: {} + + pascal-case@3.1.2: + dependencies: + no-case: 3.0.4 + tslib: 2.8.1 + + path-exists@5.0.0: {} + + path-is-absolute@1.0.1: {} + + path-is-inside@1.0.2: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-to-regexp@0.1.12: {} + + path-to-regexp@1.9.0: + dependencies: + isarray: 0.0.1 + + path-to-regexp@3.3.0: {} + + path-type@4.0.0: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + pkg-dir@7.0.0: + dependencies: + find-up: 6.3.0 + + postcss-attribute-case-insensitive@7.0.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 7.1.0 + + postcss-calc@9.0.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 6.1.2 + postcss-value-parser: 4.2.0 + + postcss-clamp@4.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-color-functional-notation@7.0.10(postcss@8.5.6): + dependencies: + '@csstools/css-color-parser': 3.0.10(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/postcss-progressive-custom-properties': 4.1.0(postcss@8.5.6) + '@csstools/utilities': 2.0.0(postcss@8.5.6) + postcss: 8.5.6 + + postcss-color-hex-alpha@10.0.0(postcss@8.5.6): + dependencies: + '@csstools/utilities': 2.0.0(postcss@8.5.6) + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-color-rebeccapurple@10.0.0(postcss@8.5.6): + dependencies: + '@csstools/utilities': 2.0.0(postcss@8.5.6) + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-colormin@6.1.0(postcss@8.5.6): + dependencies: + browserslist: 4.25.1 + caniuse-api: 3.0.0 + colord: 2.9.3 + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-convert-values@6.1.0(postcss@8.5.6): + dependencies: + browserslist: 4.25.1 + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-custom-media@11.0.6(postcss@8.5.6): + dependencies: + '@csstools/cascade-layer-name-parser': 2.0.5(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/media-query-list-parser': 4.0.3(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + postcss: 8.5.6 + + postcss-custom-properties@14.0.6(postcss@8.5.6): + dependencies: + '@csstools/cascade-layer-name-parser': 2.0.5(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/utilities': 2.0.0(postcss@8.5.6) + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-custom-selectors@8.0.5(postcss@8.5.6): + dependencies: + '@csstools/cascade-layer-name-parser': 2.0.5(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + postcss: 8.5.6 + postcss-selector-parser: 7.1.0 + + postcss-dir-pseudo-class@9.0.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 7.1.0 + + postcss-discard-comments@6.0.2(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-discard-duplicates@6.0.3(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-discard-empty@6.0.3(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-discard-overridden@6.0.2(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-discard-unused@6.0.5(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 6.1.2 + + postcss-double-position-gradients@6.0.2(postcss@8.5.6): + dependencies: + '@csstools/postcss-progressive-custom-properties': 4.1.0(postcss@8.5.6) + '@csstools/utilities': 2.0.0(postcss@8.5.6) + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-focus-visible@10.0.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 7.1.0 + + postcss-focus-within@9.0.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 7.1.0 + + postcss-font-variant@5.0.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-gap-properties@6.0.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-image-set-function@7.0.0(postcss@8.5.6): + dependencies: + '@csstools/utilities': 2.0.0(postcss@8.5.6) + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-lab-function@7.0.10(postcss@8.5.6): + dependencies: + '@csstools/css-color-parser': 3.0.10(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/postcss-progressive-custom-properties': 4.1.0(postcss@8.5.6) + '@csstools/utilities': 2.0.0(postcss@8.5.6) + postcss: 8.5.6 + + postcss-loader@7.3.4(postcss@8.5.6)(typescript@5.6.3)(webpack@5.100.2): + dependencies: + cosmiconfig: 8.3.6(typescript@5.6.3) + jiti: 1.21.7 + postcss: 8.5.6 + semver: 7.7.2 + webpack: 5.100.2 + transitivePeerDependencies: + - typescript + + postcss-logical@8.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-merge-idents@6.0.3(postcss@8.5.6): + dependencies: + cssnano-utils: 4.0.2(postcss@8.5.6) + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-merge-longhand@6.0.5(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + stylehacks: 6.1.1(postcss@8.5.6) + + postcss-merge-rules@6.1.1(postcss@8.5.6): + dependencies: + browserslist: 4.25.1 + caniuse-api: 3.0.0 + cssnano-utils: 4.0.2(postcss@8.5.6) + postcss: 8.5.6 + postcss-selector-parser: 6.1.2 + + postcss-minify-font-values@6.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-minify-gradients@6.0.3(postcss@8.5.6): + dependencies: + colord: 2.9.3 + cssnano-utils: 4.0.2(postcss@8.5.6) + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-minify-params@6.1.0(postcss@8.5.6): + dependencies: + browserslist: 4.25.1 + cssnano-utils: 4.0.2(postcss@8.5.6) + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-minify-selectors@6.0.4(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 6.1.2 + + postcss-modules-extract-imports@3.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-modules-local-by-default@4.2.0(postcss@8.5.6): + dependencies: + icss-utils: 5.1.0(postcss@8.5.6) + postcss: 8.5.6 + postcss-selector-parser: 7.1.0 + postcss-value-parser: 4.2.0 + + postcss-modules-scope@3.2.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 7.1.0 + + postcss-modules-values@4.0.0(postcss@8.5.6): + dependencies: + icss-utils: 5.1.0(postcss@8.5.6) + postcss: 8.5.6 + + postcss-nesting@13.0.2(postcss@8.5.6): + dependencies: + '@csstools/selector-resolve-nested': 3.1.0(postcss-selector-parser@7.1.0) + '@csstools/selector-specificity': 5.0.0(postcss-selector-parser@7.1.0) + postcss: 8.5.6 + postcss-selector-parser: 7.1.0 + + postcss-normalize-charset@6.0.2(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-normalize-display-values@6.0.2(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-normalize-positions@6.0.2(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-normalize-repeat-style@6.0.2(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-normalize-string@6.0.2(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-normalize-timing-functions@6.0.2(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-normalize-unicode@6.1.0(postcss@8.5.6): + dependencies: + browserslist: 4.25.1 + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-normalize-url@6.0.2(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-normalize-whitespace@6.0.2(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-opacity-percentage@3.0.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-ordered-values@6.0.2(postcss@8.5.6): + dependencies: + cssnano-utils: 4.0.2(postcss@8.5.6) + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-overflow-shorthand@6.0.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-page-break@3.0.4(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-place@10.0.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-preset-env@10.2.4(postcss@8.5.6): + dependencies: + '@csstools/postcss-cascade-layers': 5.0.2(postcss@8.5.6) + '@csstools/postcss-color-function': 4.0.10(postcss@8.5.6) + '@csstools/postcss-color-mix-function': 3.0.10(postcss@8.5.6) + '@csstools/postcss-color-mix-variadic-function-arguments': 1.0.0(postcss@8.5.6) + '@csstools/postcss-content-alt-text': 2.0.6(postcss@8.5.6) + '@csstools/postcss-exponential-functions': 2.0.9(postcss@8.5.6) + '@csstools/postcss-font-format-keywords': 4.0.0(postcss@8.5.6) + '@csstools/postcss-gamut-mapping': 2.0.10(postcss@8.5.6) + '@csstools/postcss-gradients-interpolation-method': 5.0.10(postcss@8.5.6) + '@csstools/postcss-hwb-function': 4.0.10(postcss@8.5.6) + '@csstools/postcss-ic-unit': 4.0.2(postcss@8.5.6) + '@csstools/postcss-initial': 2.0.1(postcss@8.5.6) + '@csstools/postcss-is-pseudo-class': 5.0.3(postcss@8.5.6) + '@csstools/postcss-light-dark-function': 2.0.9(postcss@8.5.6) + '@csstools/postcss-logical-float-and-clear': 3.0.0(postcss@8.5.6) + '@csstools/postcss-logical-overflow': 2.0.0(postcss@8.5.6) + '@csstools/postcss-logical-overscroll-behavior': 2.0.0(postcss@8.5.6) + '@csstools/postcss-logical-resize': 3.0.0(postcss@8.5.6) + '@csstools/postcss-logical-viewport-units': 3.0.4(postcss@8.5.6) + '@csstools/postcss-media-minmax': 2.0.9(postcss@8.5.6) + '@csstools/postcss-media-queries-aspect-ratio-number-values': 3.0.5(postcss@8.5.6) + '@csstools/postcss-nested-calc': 4.0.0(postcss@8.5.6) + '@csstools/postcss-normalize-display-values': 4.0.0(postcss@8.5.6) + '@csstools/postcss-oklab-function': 4.0.10(postcss@8.5.6) + '@csstools/postcss-progressive-custom-properties': 4.1.0(postcss@8.5.6) + '@csstools/postcss-random-function': 2.0.1(postcss@8.5.6) + '@csstools/postcss-relative-color-syntax': 3.0.10(postcss@8.5.6) + '@csstools/postcss-scope-pseudo-class': 4.0.1(postcss@8.5.6) + '@csstools/postcss-sign-functions': 1.1.4(postcss@8.5.6) + '@csstools/postcss-stepped-value-functions': 4.0.9(postcss@8.5.6) + '@csstools/postcss-text-decoration-shorthand': 4.0.2(postcss@8.5.6) + '@csstools/postcss-trigonometric-functions': 4.0.9(postcss@8.5.6) + '@csstools/postcss-unset-value': 4.0.0(postcss@8.5.6) + autoprefixer: 10.4.21(postcss@8.5.6) + browserslist: 4.25.1 + css-blank-pseudo: 7.0.1(postcss@8.5.6) + css-has-pseudo: 7.0.2(postcss@8.5.6) + css-prefers-color-scheme: 10.0.0(postcss@8.5.6) + cssdb: 8.3.1 + postcss: 8.5.6 + postcss-attribute-case-insensitive: 7.0.1(postcss@8.5.6) + postcss-clamp: 4.1.0(postcss@8.5.6) + postcss-color-functional-notation: 7.0.10(postcss@8.5.6) + postcss-color-hex-alpha: 10.0.0(postcss@8.5.6) + postcss-color-rebeccapurple: 10.0.0(postcss@8.5.6) + postcss-custom-media: 11.0.6(postcss@8.5.6) + postcss-custom-properties: 14.0.6(postcss@8.5.6) + postcss-custom-selectors: 8.0.5(postcss@8.5.6) + postcss-dir-pseudo-class: 9.0.1(postcss@8.5.6) + postcss-double-position-gradients: 6.0.2(postcss@8.5.6) + postcss-focus-visible: 10.0.1(postcss@8.5.6) + postcss-focus-within: 9.0.1(postcss@8.5.6) + postcss-font-variant: 5.0.0(postcss@8.5.6) + postcss-gap-properties: 6.0.0(postcss@8.5.6) + postcss-image-set-function: 7.0.0(postcss@8.5.6) + postcss-lab-function: 7.0.10(postcss@8.5.6) + postcss-logical: 8.1.0(postcss@8.5.6) + postcss-nesting: 13.0.2(postcss@8.5.6) + postcss-opacity-percentage: 3.0.0(postcss@8.5.6) + postcss-overflow-shorthand: 6.0.0(postcss@8.5.6) + postcss-page-break: 3.0.4(postcss@8.5.6) + postcss-place: 10.0.0(postcss@8.5.6) + postcss-pseudo-class-any-link: 10.0.1(postcss@8.5.6) + postcss-replace-overflow-wrap: 4.0.0(postcss@8.5.6) + postcss-selector-not: 8.0.1(postcss@8.5.6) + + postcss-pseudo-class-any-link@10.0.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 7.1.0 + + postcss-reduce-idents@6.0.3(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-reduce-initial@6.1.0(postcss@8.5.6): + dependencies: + browserslist: 4.25.1 + caniuse-api: 3.0.0 + postcss: 8.5.6 + + postcss-reduce-transforms@6.0.2(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-replace-overflow-wrap@4.0.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-selector-not@8.0.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 7.1.0 + + postcss-selector-parser@6.1.2: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-selector-parser@7.1.0: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-sort-media-queries@5.2.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + sort-css-media-queries: 2.2.0 + + postcss-svgo@6.0.3(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + svgo: 3.3.2 + + postcss-unique-selectors@6.0.4(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 6.1.2 + + postcss-value-parser@4.2.0: {} + + postcss-zindex@6.0.2(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + pretty-error@4.0.0: + dependencies: + lodash: 4.17.21 + renderkid: 3.0.0 + + pretty-time@1.1.0: {} + + prism-react-renderer@2.4.1(react@19.1.0): + dependencies: + '@types/prismjs': 1.26.5 + clsx: 2.1.1 + react: 19.1.0 + + prismjs@1.30.0: {} + + process-nextick-args@2.0.1: {} + + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + + prop-types@15.8.1: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + property-information@6.5.0: {} + + property-information@7.1.0: {} + + proto-list@1.2.4: {} + + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + punycode@2.3.1: {} + + pupa@3.1.0: + dependencies: + escape-goat: 4.0.0 + + qs@6.13.0: + dependencies: + side-channel: 1.1.0 + + queue-microtask@1.2.3: {} + + quick-lru@5.1.1: {} + + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + + range-parser@1.2.0: {} + + range-parser@1.2.1: {} + + raw-body@2.5.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + + rc@1.2.8: + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + + react-dom@19.1.0(react@19.1.0): + dependencies: + react: 19.1.0 + scheduler: 0.26.0 + + react-fast-compare@3.2.2: {} + + react-is@16.13.1: {} + + react-json-view-lite@2.4.1(react@19.1.0): + dependencies: + react: 19.1.0 + + react-loadable-ssr-addon-v5-slorber@1.0.1(@docusaurus/react-loadable@6.0.0(react@19.1.0))(webpack@5.100.2): + dependencies: + '@babel/runtime': 7.27.6 + react-loadable: '@docusaurus/react-loadable@6.0.0(react@19.1.0)' + webpack: 5.100.2 + + react-router-config@5.1.1(react-router@5.3.4(react@19.1.0))(react@19.1.0): + dependencies: + '@babel/runtime': 7.27.6 + react: 19.1.0 + react-router: 5.3.4(react@19.1.0) + + react-router-dom@5.3.4(react@19.1.0): + dependencies: + '@babel/runtime': 7.27.6 + history: 4.10.1 + loose-envify: 1.4.0 + prop-types: 15.8.1 + react: 19.1.0 + react-router: 5.3.4(react@19.1.0) + tiny-invariant: 1.3.3 + tiny-warning: 1.0.3 + + react-router@5.3.4(react@19.1.0): + dependencies: + '@babel/runtime': 7.27.6 + history: 4.10.1 + hoist-non-react-statics: 3.3.2 + loose-envify: 1.4.0 + path-to-regexp: 1.9.0 + prop-types: 15.8.1 + react: 19.1.0 + react-is: 16.13.1 + tiny-invariant: 1.3.3 + tiny-warning: 1.0.3 + + react@19.1.0: {} + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + recma-build-jsx@1.0.0: + dependencies: + '@types/estree': 1.0.8 + estree-util-build-jsx: 3.0.1 + vfile: 6.0.3 + + recma-jsx@1.0.0(acorn@8.15.0): + dependencies: + acorn-jsx: 5.3.2(acorn@8.15.0) + estree-util-to-js: 2.0.0 + recma-parse: 1.0.0 + recma-stringify: 1.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - acorn + + recma-parse@1.0.0: + dependencies: + '@types/estree': 1.0.8 + esast-util-from-js: 2.0.1 + unified: 11.0.5 + vfile: 6.0.3 + + recma-stringify@1.0.0: + dependencies: + '@types/estree': 1.0.8 + estree-util-to-js: 2.0.0 + unified: 11.0.5 + vfile: 6.0.3 + + regenerate-unicode-properties@10.2.0: + dependencies: + regenerate: 1.4.2 + + regenerate@1.4.2: {} + + regexpu-core@6.2.0: + dependencies: + regenerate: 1.4.2 + regenerate-unicode-properties: 10.2.0 + regjsgen: 0.8.0 + regjsparser: 0.12.0 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.2.0 + + registry-auth-token@5.1.0: + dependencies: + '@pnpm/npm-conf': 2.3.1 + + registry-url@6.0.1: + dependencies: + rc: 1.2.8 + + regjsgen@0.8.0: {} + + regjsparser@0.12.0: + dependencies: + jsesc: 3.0.2 + + rehype-raw@7.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-raw: 9.1.0 + vfile: 6.0.3 + + rehype-recma@1.0.0: + dependencies: + '@types/estree': 1.0.8 + '@types/hast': 3.0.4 + hast-util-to-estree: 3.1.3 + transitivePeerDependencies: + - supports-color + + relateurl@0.2.7: {} + + remark-directive@3.0.1: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-directive: 3.1.0 + micromark-extension-directive: 3.0.2 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-emoji@4.0.1: + dependencies: + '@types/mdast': 4.0.4 + emoticon: 4.1.0 + mdast-util-find-and-replace: 3.0.2 + node-emoji: 2.2.0 + unified: 11.0.5 + + remark-frontmatter@5.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-frontmatter: 2.0.1 + micromark-extension-frontmatter: 2.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-gfm@4.0.1: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-gfm: 3.1.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-mdx@3.1.0: + dependencies: + mdast-util-mdx: 3.0.0 + micromark-extension-mdxjs: 3.0.0 + transitivePeerDependencies: + - supports-color + + remark-parse@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + micromark-util-types: 2.0.2 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-rehype@11.1.2: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + mdast-util-to-hast: 13.2.0 + unified: 11.0.5 + vfile: 6.0.3 + + remark-stringify@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-to-markdown: 2.1.2 + unified: 11.0.5 + + renderkid@3.0.0: + dependencies: + css-select: 4.3.0 + dom-converter: 0.2.0 + htmlparser2: 6.1.0 + lodash: 4.17.21 + strip-ansi: 6.0.1 + + repeat-string@1.6.1: {} + + require-from-string@2.0.2: {} + + require-like@0.1.2: {} + + requires-port@1.0.0: {} + + resolve-alpn@1.2.1: {} + + resolve-from@4.0.0: {} + + resolve-pathname@3.0.0: {} + + resolve@1.22.10: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + responselike@3.0.0: + dependencies: + lowercase-keys: 3.0.0 + + retry@0.13.1: {} + + reusify@1.1.0: {} + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + rtlcss@4.3.0: + dependencies: + escalade: 3.2.0 + picocolors: 1.1.1 + postcss: 8.5.6 + strip-json-comments: 3.1.1 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + safer-buffer@2.1.2: {} + + sax@1.4.1: {} + + scheduler@0.26.0: {} + + schema-dts@1.1.5: {} + + schema-utils@3.3.0: + dependencies: + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + + schema-utils@4.3.2: + dependencies: + '@types/json-schema': 7.0.15 + ajv: 8.17.1 + ajv-formats: 2.1.1(ajv@8.17.1) + ajv-keywords: 5.1.0(ajv@8.17.1) + + search-insights@2.17.3: {} + + section-matter@1.0.0: + dependencies: + extend-shallow: 2.0.1 + kind-of: 6.0.3 + + select-hose@2.0.0: {} + + selfsigned@2.4.1: + dependencies: + '@types/node-forge': 1.3.13 + node-forge: 1.3.1 + + semver-diff@4.0.0: + dependencies: + semver: 7.7.2 + + semver@6.3.1: {} + + semver@7.7.2: {} + + 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 + transitivePeerDependencies: + - supports-color + + serialize-javascript@6.0.2: + dependencies: + randombytes: 2.1.0 + + serve-handler@6.1.6: + dependencies: + bytes: 3.0.0 + content-disposition: 0.5.2 + mime-types: 2.1.18 + minimatch: 3.1.2 + path-is-inside: 1.0.2 + path-to-regexp: 3.3.0 + range-parser: 1.2.0 + + serve-index@1.9.1: + dependencies: + accepts: 1.3.8 + batch: 0.6.1 + debug: 2.6.9 + escape-html: 1.0.3 + http-errors: 1.6.3 + mime-types: 2.1.35 + parseurl: 1.3.3 + transitivePeerDependencies: + - supports-color + + serve-static@1.16.2: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.19.0 + transitivePeerDependencies: + - supports-color + + 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.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + setprototypeof@1.1.0: {} + + setprototypeof@1.2.0: {} + + shallow-clone@3.0.1: + dependencies: + kind-of: 6.0.3 + + shallowequal@1.1.0: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + shell-quote@1.8.3: {} + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + signal-exit@3.0.7: {} + + sirv@2.0.4: + dependencies: + '@polka/url': 1.0.0-next.29 + mrmime: 2.0.1 + totalist: 3.0.1 + + sisteransi@1.0.5: {} + + sitemap@7.1.2: + dependencies: + '@types/node': 17.0.45 + '@types/sax': 1.2.7 + arg: 5.0.2 + sax: 1.4.1 + + skin-tone@2.0.0: + dependencies: + unicode-emoji-modifier-base: 1.0.0 + + slash@3.0.0: {} + + slash@4.0.0: {} + + snake-case@3.0.4: + dependencies: + dot-case: 3.0.4 + tslib: 2.8.1 + + sockjs@0.3.24: + dependencies: + faye-websocket: 0.11.4 + uuid: 8.3.2 + websocket-driver: 0.7.4 + + sort-css-media-queries@2.2.0: {} + + source-map-js@1.2.1: {} + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + source-map@0.7.4: {} + + space-separated-tokens@2.0.2: {} + + spdy-transport@3.0.0: + dependencies: + debug: 4.4.1 + detect-node: 2.1.0 + hpack.js: 2.1.6 + obuf: 1.1.2 + readable-stream: 3.6.2 + wbuf: 1.7.3 + transitivePeerDependencies: + - supports-color + + spdy@4.0.2: + dependencies: + debug: 4.4.1 + handle-thing: 2.0.1 + http-deceiver: 1.2.7 + select-hose: 2.0.0 + spdy-transport: 3.0.0 + transitivePeerDependencies: + - supports-color + + sprintf-js@1.0.3: {} + + srcset@4.0.0: {} + + statuses@1.5.0: {} + + statuses@2.0.1: {} + + std-env@3.9.0: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + + stringify-object@3.3.0: + dependencies: + get-own-enumerable-property-symbols: 3.0.2 + is-obj: 1.0.1 + is-regexp: 1.0.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.1.0 + + strip-bom-string@1.0.0: {} + + strip-final-newline@2.0.0: {} + + strip-json-comments@2.0.1: {} + + strip-json-comments@3.1.1: {} + + style-to-js@1.1.17: + dependencies: + style-to-object: 1.0.9 + + style-to-object@1.0.9: + dependencies: + inline-style-parser: 0.2.4 + + stylehacks@6.1.1(postcss@8.5.6): + dependencies: + browserslist: 4.25.1 + postcss: 8.5.6 + postcss-selector-parser: 6.1.2 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + svg-parser@2.0.4: {} + + svgo@3.3.2: + dependencies: + '@trysound/sax': 0.2.0 + commander: 7.2.0 + css-select: 5.2.2 + css-tree: 2.3.1 + css-what: 6.2.2 + csso: 5.0.5 + picocolors: 1.1.1 + + tapable@2.2.2: {} + + terser-webpack-plugin@5.3.14(webpack@5.100.2): + dependencies: + '@jridgewell/trace-mapping': 0.3.29 + jest-worker: 27.5.1 + schema-utils: 4.3.2 + serialize-javascript: 6.0.2 + terser: 5.43.1 + webpack: 5.100.2 + + terser@5.43.1: + dependencies: + '@jridgewell/source-map': 0.3.10 + acorn: 8.15.0 + commander: 2.20.3 + source-map-support: 0.5.21 + + thunky@1.1.0: {} + + tiny-invariant@1.3.3: {} + + tiny-warning@1.0.3: {} + + tinypool@1.1.1: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toidentifier@1.0.1: {} + + totalist@3.0.1: {} + + trim-lines@3.0.1: {} + + trough@2.2.0: {} + + tslib@2.8.1: {} + + type-fest@0.21.3: {} + + type-fest@1.4.0: {} + + type-fest@2.19.0: {} + + type-is@1.6.18: + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + + typedarray-to-buffer@3.1.5: + dependencies: + is-typedarray: 1.0.0 + + typescript@5.6.3: {} + + undici-types@7.8.0: {} + + unicode-canonical-property-names-ecmascript@2.0.1: {} + + unicode-emoji-modifier-base@1.0.0: {} + + unicode-match-property-ecmascript@2.0.0: + dependencies: + unicode-canonical-property-names-ecmascript: 2.0.1 + unicode-property-aliases-ecmascript: 2.1.0 + + unicode-match-property-value-ecmascript@2.2.0: {} + + unicode-property-aliases-ecmascript@2.1.0: {} + + unified@11.0.5: + dependencies: + '@types/unist': 3.0.3 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.3 + + unique-string@3.0.0: + dependencies: + crypto-random-string: 4.0.0 + + unist-util-is@6.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position-from-estree@2.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@6.0.1: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + + unist-util-visit@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + universalify@2.0.1: {} + + unpipe@1.0.0: {} + + update-browserslist-db@1.1.3(browserslist@4.25.1): + dependencies: + browserslist: 4.25.1 + escalade: 3.2.0 + picocolors: 1.1.1 + + update-notifier@6.0.2: + dependencies: + boxen: 7.1.1 + chalk: 5.4.1 + configstore: 6.0.0 + has-yarn: 3.0.0 + import-lazy: 4.0.0 + is-ci: 3.0.1 + is-installed-globally: 0.4.0 + is-npm: 6.0.0 + is-yarn-global: 0.4.1 + latest-version: 7.0.0 + pupa: 3.1.0 + semver: 7.7.2 + semver-diff: 4.0.0 + xdg-basedir: 5.1.0 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + url-loader@4.1.1(file-loader@6.2.0(webpack@5.100.2))(webpack@5.100.2): + dependencies: + loader-utils: 2.0.4 + mime-types: 2.1.35 + schema-utils: 3.3.0 + webpack: 5.100.2 + optionalDependencies: + file-loader: 6.2.0(webpack@5.100.2) + + util-deprecate@1.0.2: {} + + utila@0.4.0: {} + + utility-types@3.11.0: {} + + utils-merge@1.0.1: {} + + uuid@8.3.2: {} + + value-equal@1.0.1: {} + + vary@1.1.2: {} + + vfile-location@5.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile: 6.0.3 + + vfile-message@4.0.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.2 + + watchpack@2.4.4: + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + + wbuf@1.7.3: + dependencies: + minimalistic-assert: 1.0.1 + + web-namespaces@2.0.1: {} + + webpack-bundle-analyzer@4.10.2: + dependencies: + '@discoveryjs/json-ext': 0.5.7 + acorn: 8.15.0 + acorn-walk: 8.3.4 + commander: 7.2.0 + debounce: 1.2.1 + escape-string-regexp: 4.0.0 + gzip-size: 6.0.0 + html-escaper: 2.0.2 + opener: 1.5.2 + picocolors: 1.1.1 + sirv: 2.0.4 + ws: 7.5.10 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + webpack-dev-middleware@5.3.4(webpack@5.100.2): + dependencies: + colorette: 2.0.20 + memfs: 3.5.3 + mime-types: 2.1.35 + range-parser: 1.2.1 + schema-utils: 4.3.2 + webpack: 5.100.2 + + webpack-dev-server@4.15.2(webpack@5.100.2): + dependencies: + '@types/bonjour': 3.5.13 + '@types/connect-history-api-fallback': 1.5.4 + '@types/express': 4.17.23 + '@types/serve-index': 1.9.4 + '@types/serve-static': 1.15.8 + '@types/sockjs': 0.3.36 + '@types/ws': 8.18.1 + ansi-html-community: 0.0.8 + bonjour-service: 1.3.0 + chokidar: 3.6.0 + colorette: 2.0.20 + compression: 1.8.0 + connect-history-api-fallback: 2.0.0 + default-gateway: 6.0.3 + express: 4.21.2 + graceful-fs: 4.2.11 + html-entities: 2.6.0 + http-proxy-middleware: 2.0.9(@types/express@4.17.23) + ipaddr.js: 2.2.0 + launch-editor: 2.10.0 + open: 8.4.2 + p-retry: 4.6.2 + rimraf: 3.0.2 + schema-utils: 4.3.2 + selfsigned: 2.4.1 + serve-index: 1.9.1 + sockjs: 0.3.24 + spdy: 4.0.2 + webpack-dev-middleware: 5.3.4(webpack@5.100.2) + ws: 8.18.3 + optionalDependencies: + webpack: 5.100.2 + transitivePeerDependencies: + - bufferutil + - debug + - supports-color + - utf-8-validate + + webpack-merge@5.10.0: + dependencies: + clone-deep: 4.0.1 + flat: 5.0.2 + wildcard: 2.0.1 + + webpack-merge@6.0.1: + dependencies: + clone-deep: 4.0.1 + flat: 5.0.2 + wildcard: 2.0.1 + + webpack-sources@3.3.3: {} + + webpack@5.100.2: + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.8 + '@types/json-schema': 7.0.15 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/wasm-edit': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + acorn: 8.15.0 + acorn-import-phases: 1.0.4(acorn@8.15.0) + browserslist: 4.25.1 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.18.2 + es-module-lexer: 1.7.0 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 4.3.2 + tapable: 2.2.2 + terser-webpack-plugin: 5.3.14(webpack@5.100.2) + watchpack: 2.4.4 + webpack-sources: 3.3.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + + webpackbar@6.0.1(webpack@5.100.2): + dependencies: + ansi-escapes: 4.3.2 + chalk: 4.1.2 + consola: 3.4.2 + figures: 3.2.0 + markdown-table: 2.0.0 + pretty-time: 1.1.0 + std-env: 3.9.0 + webpack: 5.100.2 + wrap-ansi: 7.0.0 + + websocket-driver@0.7.4: + dependencies: + http-parser-js: 0.5.10 + safe-buffer: 5.2.1 + websocket-extensions: 0.1.4 + + websocket-extensions@0.1.4: {} + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + widest-line@4.0.1: + dependencies: + string-width: 5.1.2 + + wildcard@2.0.1: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + wrappy@1.0.2: {} + + write-file-atomic@3.0.3: + dependencies: + imurmurhash: 0.1.4 + is-typedarray: 1.0.0 + signal-exit: 3.0.7 + typedarray-to-buffer: 3.1.5 + + ws@7.5.10: {} + + ws@8.18.3: {} + + xdg-basedir@5.1.0: {} + + xml-js@1.6.11: + dependencies: + sax: 1.4.1 + + yallist@3.1.1: {} + + yocto-queue@1.2.1: {} + + zwitch@2.0.4: {} diff --git a/website/sidebars.ts b/website/sidebars.ts new file mode 100644 index 0000000..cebf74c --- /dev/null +++ b/website/sidebars.ts @@ -0,0 +1,37 @@ +import type { SidebarsConfig } from '@docusaurus/plugin-content-docs'; + +// This runs in Node.js - Don't use client-side code here (browser APIs, JSX...) + +/** + * Creating a sidebar enables you to: + - create an ordered group of docs + - render a sidebar for each doc of that group + - provide next/previous navigation + + The sidebars can be generated from the filesystem, or explicitly defined here. + + Create as many sidebars as you want. + */ +const sidebars: SidebarsConfig = { + // Main documentation sidebar - minimal essential pages + tutorialSidebar: [ + 'intro', + 'getting-started', + 'language-basics', + 'examples', + { + type: 'category', + label: 'Specifications', + items: [ + 'specifications/index', + 'specifications/grammar', + 'specifications/hir', + 'specifications/formal-verification', + 'specifications/api', + ], + }, + 'api-reference', + ], +}; + +export default sidebars; diff --git a/website/src/components/HomepageFeatures/index.tsx b/website/src/components/HomepageFeatures/index.tsx new file mode 100644 index 0000000..8b2b3d2 --- /dev/null +++ b/website/src/components/HomepageFeatures/index.tsx @@ -0,0 +1,77 @@ +import type { ReactNode } from 'react'; +import clsx from 'clsx'; +import Heading from '@theme/Heading'; +import styles from './styles.module.css'; + +type FeatureItem = { + title: string; + Svg: React.ComponentType>; + description: ReactNode; +}; + +const FeatureList: FeatureItem[] = [ + { + title: 'Development Status', + Svg: require('@site/static/img/undraw_docusaurus_mountain.svg').default, + description: ( + <> + Core Pipeline: Lexical analysis → Syntax analysis → Semantic analysis → HIR → Yul → Bytecode is functional.
+ In Progress: Formal verification system, advanced safety checks, and comprehensive error handling. + + ), + }, + { + title: 'Language Design', + Svg: require('@site/static/img/undraw_docusaurus_tree.svg').default, + description: ( + <> + Error Handling: Zig-style !T error unions with explicit error declarations.
+ Memory Regions: Clear distinction between storage, immutable, and compile-time constants.
+ Safety: Explicit memory management and type safety by design. + + ), + }, + { + title: 'Implementation Notes', + Svg: require('@site/static/img/undraw_docusaurus_react.svg').default, + description: ( + <> + Built with Zig: Leveraging Zig's compile-time capabilities for meta-programming.
+ Yul Backend: Compiles to Ethereum's intermediate language for optimal bytecode generation.
+ Formal Methods: Exploring mathematical proof systems for contract verification. + + ), + }, +]; + +function Feature({ title, Svg, description }: FeatureItem) { + return ( +
+
+ +
+
+ {title} +
{description}
+
+
+ ); +} + +export default function HomepageFeatures(): ReactNode { + return ( +
+
+
+ Development Overview +

Current implementation status and design decisions

+
+
+ {FeatureList.map((props, idx) => ( + + ))} +
+
+
+ ); +} diff --git a/website/src/components/HomepageFeatures/styles.module.css b/website/src/components/HomepageFeatures/styles.module.css new file mode 100644 index 0000000..fdd6494 --- /dev/null +++ b/website/src/components/HomepageFeatures/styles.module.css @@ -0,0 +1,55 @@ +.features { + display: flex; + align-items: center; + padding: 2rem 0; + width: 100%; + background: linear-gradient(180deg, rgba(255, 255, 255, 0.02) 0%, rgba(255, 255, 255, 0.05) 100%); +} + +.featureSvg { + height: 200px; + width: 200px; + opacity: 0.8; +} + +.featureDescription { + text-align: left; + line-height: 1.6; + color: var(--ifm-color-emphasis-700); +} + +.featureDescription strong { + color: var(--ifm-color-primary); + font-weight: 600; +} + +.featureDescription code { + background: var(--ifm-code-background); + color: var(--ifm-code-color); + padding: 0.2em 0.4em; + border-radius: 3px; + font-size: 0.9em; +} + +.featureDescription br { + margin-bottom: 0.5rem; +} + +[data-theme='dark'] .featureDescription { + color: var(--ifm-color-emphasis-800); +} + +[data-theme='dark'] .featureDescription strong { + color: var(--ifm-color-primary-light); +} + +@media screen and (max-width: 768px) { + .featureSvg { + height: 150px; + width: 150px; + } + + .featureDescription { + font-size: 0.9rem; + } +} \ No newline at end of file diff --git a/website/src/css/custom.css b/website/src/css/custom.css new file mode 100644 index 0000000..90946db --- /dev/null +++ b/website/src/css/custom.css @@ -0,0 +1,221 @@ +/** + * Any CSS included here will be global. The classic template + * bundles Infima by default. Infima is a CSS framework designed to + * work well for content-centric websites. + */ + +/* You can override the default Infima variables here. */ +:root { + /* Ora Brand Colors - Professional Blue-Purple Theme */ + --ifm-color-primary: #4c6ef5; + --ifm-color-primary-dark: #3b5df0; + --ifm-color-primary-darker: #2f4ceb; + --ifm-color-primary-darkest: #1e3ae6; + --ifm-color-primary-light: #5d7ffa; + --ifm-color-primary-lighter: #6e90ff; + --ifm-color-primary-lightest: #8fa2ff; + + /* Enhanced code styling for Ora */ + --ifm-code-font-size: 95%; + --ifm-code-background: rgba(76, 110, 245, 0.1); + --ifm-code-color: #4c6ef5; + --docusaurus-highlighted-code-line-bg: rgba(76, 110, 245, 0.1); + + /* Custom Ora accent colors */ + --ora-accent-purple: #7c3aed; + --ora-accent-blue: #2563eb; + --ora-accent-cyan: #06b6d4; + --ora-success: #10b981; + --ora-warning: #f59e0b; + --ora-error: #ef4444; + + /* Typography improvements */ + --ifm-font-family-base: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; + --ifm-font-family-monospace: 'JetBrains Mono', 'Fira Code', Monaco, 'Cascadia Code', 'Roboto Mono', monospace; + --ifm-h1-font-size: 2.5rem; + --ifm-h2-font-size: 2rem; + --ifm-h3-font-size: 1.5rem; +} + +/* For readability concerns, you should choose a lighter palette in dark mode. */ +[data-theme='dark'] { + --ifm-color-primary: #6e90ff; + --ifm-color-primary-dark: #4c6ef5; + --ifm-color-primary-darker: #3b5df0; + --ifm-color-primary-darkest: #2f4ceb; + --ifm-color-primary-light: #8fa2ff; + --ifm-color-primary-lighter: #a0b4ff; + --ifm-color-primary-lightest: #b1c5ff; + + --ifm-code-background: rgba(110, 144, 255, 0.15); + --ifm-code-color: #a0b4ff; + --docusaurus-highlighted-code-line-bg: rgba(110, 144, 255, 0.2); + + /* Dark mode background adjustments */ + --ifm-background-color: #0f172a; + --ifm-background-surface-color: #1e293b; +} + +/* Enhanced code block styling */ +.prism-code { + font-family: var(--ifm-font-family-monospace); + font-size: 0.9rem; + line-height: 1.6; +} + +/* Ora language syntax highlighting */ +.token.keyword { + color: var(--ora-accent-purple); + font-weight: 600; +} + +.token.type { + color: var(--ora-accent-blue); + font-weight: 500; +} + +.token.builtin { + color: var(--ora-accent-cyan); + font-weight: 500; +} + +.token.stdlib { + color: var(--ora-success); + font-weight: 500; +} + +.token.function { + color: var(--ifm-color-primary); + font-weight: 500; +} + +.token.string { + color: var(--ora-success); +} + +.token.number { + color: var(--ora-warning); +} + +.token.comment { + color: #64748b; + font-style: italic; +} + +.token.operator { + color: var(--ora-accent-purple); +} + +.token.punctuation { + color: #64748b; +} + +.token.annotation { + color: var(--ora-accent-cyan); + font-weight: 500; +} + +.token.error-type { + color: var(--ora-error); + font-weight: 500; +} + +.token.attribute { + color: var(--ora-accent-purple); + font-style: italic; +} + +/* Dark mode syntax highlighting adjustments */ +[data-theme='dark'] .token.comment { + color: #94a3b8; +} + +[data-theme='dark'] .token.punctuation { + color: #94a3b8; +} + +[data-theme='dark'] .token.string { + color: #34d399; +} + +[data-theme='dark'] .token.number { + color: #fbbf24; +} + +[data-theme='dark'] .token.stdlib { + color: #10b981; +} + +[data-theme='dark'] .token.error-type { + color: #f87171; +} + +/* Hero section enhancements */ +.hero { + background: linear-gradient(135deg, var(--ifm-color-primary) 0%, var(--ora-accent-purple) 100%); + color: white; +} + +.hero .hero__title { + font-size: 3.5rem; + font-weight: 700; +} + +.hero .hero__subtitle { + font-size: 1.25rem; + opacity: 0.9; +} + +/* Button enhancements */ +.button--primary { + background: linear-gradient(135deg, var(--ifm-color-primary) 0%, var(--ora-accent-purple) 100%); + border: none; + font-weight: 600; + transition: all 0.3s ease; +} + +.button--primary:hover { + background: linear-gradient(135deg, var(--ifm-color-primary-dark) 0%, var(--ora-accent-purple) 100%); + transform: translateY(-2px); + box-shadow: 0 8px 25px rgba(76, 110, 245, 0.3); +} + +/* Card enhancements */ +.card { + border-radius: 12px; + border: 1px solid rgba(76, 110, 245, 0.1); + transition: all 0.3s ease; +} + +.card:hover { + transform: translateY(-4px); + box-shadow: 0 12px 40px rgba(76, 110, 245, 0.15); +} + +/* Navigation improvements */ +.navbar { + backdrop-filter: blur(10px); + background: rgba(255, 255, 255, 0.95); + border-bottom: 1px solid rgba(76, 110, 245, 0.1); +} + +[data-theme='dark'] .navbar { + background: rgba(15, 23, 42, 0.95); + border-bottom: 1px solid rgba(110, 144, 255, 0.2); +} + +/* Footer styling */ +.footer { + background: linear-gradient(135deg, #1e293b 0%, #0f172a 100%); +} + +/* Responsive design improvements */ +@media (max-width: 768px) { + .hero .hero__title { + font-size: 2.5rem; + } + + .hero .hero__subtitle { + font-size: 1.1rem; + } +} \ No newline at end of file diff --git a/website/src/pages/api-docs.tsx b/website/src/pages/api-docs.tsx new file mode 100644 index 0000000..02f90dc --- /dev/null +++ b/website/src/pages/api-docs.tsx @@ -0,0 +1,30 @@ +import React, { useEffect } from 'react'; +import Layout from '@theme/Layout'; + +export default function ApiDocsRedirect(): React.ReactElement { + useEffect(() => { + // Redirect to the API documentation + window.location.href = '/api-docs/index.html'; + }, []); + + return ( + +
+

Redirecting to API Documentation...

+

+ If you are not automatically redirected, please{' '} + click here. +

+
+
+ ); +} \ No newline at end of file diff --git a/website/src/pages/index.module.css b/website/src/pages/index.module.css new file mode 100644 index 0000000..f1b62ec --- /dev/null +++ b/website/src/pages/index.module.css @@ -0,0 +1,235 @@ +/** + * CSS files with the .module.css suffix will be treated as CSS modules + * and scoped locally. + */ + +.heroBanner { + padding: 6rem 0; + text-align: center; + position: relative; + overflow: hidden; +} + +@media screen and (max-width: 996px) { + .heroBanner { + padding: 4rem 2rem; + } +} + +.buttons { + display: flex; + align-items: center; + justify-content: center; + gap: 1rem; + margin: 2rem 0; + flex-wrap: wrap; +} + +@media screen and (max-width: 768px) { + .buttons { + flex-direction: column; + gap: 0.8rem; + } +} + +/* Experimental Status Banner */ +.statusBanner { + max-width: 800px; + margin: 2rem auto; +} + +.experimentalWarning { + background: rgba(239, 68, 68, 0.1); + border: 2px solid rgba(239, 68, 68, 0.3); + border-radius: 12px; + padding: 1.5rem; + display: flex; + flex-direction: column; + gap: 0.5rem; + backdrop-filter: blur(10px); +} + +.experimentalWarning strong { + color: #fca5a5; + font-size: 1.1rem; + font-weight: 600; +} + +.experimentalWarning span { + color: rgba(255, 255, 255, 0.9); + font-size: 0.95rem; + line-height: 1.5; +} + +/* Implementation Status */ +.implementationStatus { + max-width: 700px; + margin: 3rem auto; +} + +.statusGrid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); + gap: 1.5rem; + margin-top: 1rem; +} + +.statusItem { + display: flex; + flex-direction: column; + align-items: center; + text-align: center; + gap: 0.5rem; + padding: 1rem; + background: rgba(255, 255, 255, 0.1); + border-radius: 8px; + backdrop-filter: blur(5px); +} + +.statusIcon { + font-size: 1.5rem; + margin-bottom: 0.5rem; +} + +.statusItem strong { + color: rgba(255, 255, 255, 0.95); + font-size: 1rem; + font-weight: 600; +} + +.statusItem span:last-child { + color: rgba(255, 255, 255, 0.7); + font-size: 0.85rem; + line-height: 1.3; +} + +/* Code Example Styling */ +.codeExample { + max-width: 600px; + margin: 3rem auto; + text-align: left; +} + +.codeHeader { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 0.5rem; + padding: 0 0.5rem; +} + +.codeHeader span { + color: rgba(255, 255, 255, 0.9); + font-weight: 600; + font-size: 0.9rem; +} + +.codeHeader small { + color: rgba(255, 255, 255, 0.6); + font-size: 0.8rem; + font-style: italic; +} + +.codeBlock { + background: rgba(255, 255, 255, 0.1); + border-radius: 12px; + padding: 1.5rem; + backdrop-filter: blur(10px); + border: 1px solid rgba(255, 255, 255, 0.2); + font-family: 'JetBrains Mono', 'Fira Code', Monaco, monospace; + font-size: 0.9rem; + line-height: 1.6; + color: rgba(255, 255, 255, 0.9); + overflow-x: auto; +} + +.codeBlock code { + background: none; + color: inherit; + padding: 0; + font-size: inherit; +} + +/* Progress Section */ +.progressSection { + max-width: 800px; + margin: 4rem auto 2rem; + text-align: center; +} + +.progressSection h3 { + color: rgba(255, 255, 255, 0.95); + font-size: 1.5rem; + margin-bottom: 2rem; + font-weight: 600; +} + +.progressGrid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); + gap: 2rem; + margin-top: 2rem; +} + +.progressItem { + display: flex; + flex-direction: column; + align-items: center; + text-align: center; + gap: 0.5rem; + padding: 1.5rem; + background: rgba(255, 255, 255, 0.05); + border-radius: 12px; + border: 1px solid rgba(255, 255, 255, 0.1); + backdrop-filter: blur(5px); +} + +.progressItem strong { + color: rgba(255, 255, 255, 0.95); + font-size: 1.1rem; + font-weight: 600; + margin-bottom: 0.5rem; +} + +.progressItem span { + color: rgba(255, 255, 255, 0.8); + font-size: 0.9rem; + line-height: 1.4; +} + +@media screen and (max-width: 768px) { + .codeExample { + margin: 2rem auto; + } + + .codeBlock { + padding: 1rem; + font-size: 0.8rem; + } + + .statusGrid { + grid-template-columns: 1fr; + gap: 1rem; + } + + .progressGrid { + grid-template-columns: 1fr; + gap: 1.5rem; + } + + .progressItem { + padding: 1rem; + } + + .experimentalWarning { + padding: 1rem; + } + + .experimentalWarning strong { + font-size: 1rem; + } + + .experimentalWarning span { + font-size: 0.9rem; + } +} \ No newline at end of file diff --git a/website/src/pages/index.tsx b/website/src/pages/index.tsx new file mode 100644 index 0000000..2f0932d --- /dev/null +++ b/website/src/pages/index.tsx @@ -0,0 +1,136 @@ +import type { ReactNode } from 'react'; +import clsx from 'clsx'; +import Link from '@docusaurus/Link'; +import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; +import Layout from '@theme/Layout'; +import HomepageFeatures from '@site/src/components/HomepageFeatures'; +import Heading from '@theme/Heading'; + +import styles from './index.module.css'; + +function HomepageHeader() { + const { siteConfig } = useDocusaurusContext(); + return ( +
+
+ + {siteConfig.title} Development Notebook + +

An experimental smart contract language with formal verification capabilities

+ + {/* Experimental Status Banner */} +
+
+ ⚠️ EXPERIMENTAL PROJECT + Ora is in active development and is NOT ready for production use. This is an open notebook documenting the language design and implementation progress. +
+
+ + {/* Implementation Status */} +
+
+
+ + Core Compilation + Lexical → Syntax → Semantic → HIR → Yul +
+
+ 🚧 + Formal Verification + In active development +
+
+ 🚧 + Advanced Safety + Memory safety, overflow protection +
+
+
+ + {/* Quick Language Overview */} +
+
+ Current Language Sample + Subject to change +
+
+            {`contract SimpleToken {
+    storage var total_supply: u256;
+    storage var balances: map[address, u256];
+    
+    log Transfer(from: address, to: address, amount: u256);
+    
+    pub fn transfer(to: address, amount: u256) -> bool {
+        requires(balances[std.transaction.sender] >= amount);
+        requires(to != std.constants.ZERO_ADDRESS);
+        
+        @lock(balances[to]);
+        balances from std.transaction.sender -> to : amount;
+        
+        log Transfer(std.transaction.sender, to, amount);
+        return true;
+    }
+}`}
+          
+
+ + {/* Development Navigation */} +
+ + Language Reference + + + Implementation Examples + + + Technical Specifications + + + Source Code + +
+ + {/* Current Progress */} +
+

Current Development Focus

+
+
+ 📝 Grammar Definition + Refining syntax and semantic rules +
+
+ 🔧 HIR Implementation + High-level IR for analysis passes +
+
+ ✅ Formal Verification + Mathematical proof system design +
+
+
+
+
+ ); +} + +export default function Home(): ReactNode { + const { siteConfig } = useDocusaurusContext(); + return ( + + +
+ +
+
+ ); +} diff --git a/website/src/pages/markdown-page.md b/website/src/pages/markdown-page.md new file mode 100644 index 0000000..9756c5b --- /dev/null +++ b/website/src/pages/markdown-page.md @@ -0,0 +1,7 @@ +--- +title: Markdown page example +--- + +# Markdown page example + +You don't need React to write simple standalone pages. diff --git a/website/src/theme/prism-include-languages.js b/website/src/theme/prism-include-languages.js new file mode 100644 index 0000000..0dc9894 --- /dev/null +++ b/website/src/theme/prism-include-languages.js @@ -0,0 +1,6 @@ +import oraGrammar from './prism-ora'; + +export default function prismIncludeLanguages(PrismObject) { + // Load our custom Ora language grammar + oraGrammar(PrismObject); +} \ No newline at end of file diff --git a/website/src/theme/prism-ora.js b/website/src/theme/prism-ora.js new file mode 100644 index 0000000..f07693d --- /dev/null +++ b/website/src/theme/prism-ora.js @@ -0,0 +1,29 @@ +export default function (Prism) { + // Ora language syntax highlighting + Prism.languages.ora = { + 'comment': { + pattern: /\/\/.*$/m, + greedy: true + }, + 'string': { + pattern: /"(?:[^"\\]|\\.)*"/, + greedy: true + }, + 'keyword': /\b(?:storage|var|const|contract|function|fn|event|log|if|else|for|while|match|try|catch|return|break|continue|import|export|struct|enum|interface|trait|impl|requires|ensures|invariant|let|mut|pub|priv|static|async|await|yield|type|alias|where|in|as|is|not|and|or|xor|mod|div|rem|shl|shr|bitand|bitor|bitxor|bitnot|self|Self|super|crate|extern|unsafe|move|ref|dyn|abstract|virtual|override|final|class|namespace|using|throw|new|delete|this|base|null|true|false|undefined|void|bool|i8|i16|i32|i64|i128|u8|u16|u32|u64|u128|usize|isize|f32|f64|char|str|String|Vec|HashMap|HashSet|Option|Result|Ok|Err|Some|None|from|to|immutable|memory|tstore|old|comptime|error|doublemap|slice|forall|where|result)\b/, + 'builtin': /\b(?:@lock|@unlock|@divTrunc|@divFloor|@mod|@rem|@shl|@shr|@bitAnd|@bitOr|@bitXor|@bitNot|@addWithOverflow|@subWithOverflow|@mulWithOverflow|@divWithOverflow|@shlWithOverflow|@shrWithOverflow|@intCast|@floatCast|@ptrCast|@errdefer|@defer|@compileError|@compileLog|@import|@cImport|@embedFile|@This|@TypeOf|@hasDecl|@hasField|@tagName|@errorName|@panic|@setRuntimeSafety|@setFloatMode|@setGlobalLinkage|@setAlignStack|@frame|@Frame|@frameSize|@frameAddress|@returnAddress|@src|@sqrt|@sin|@cos|@tan|@exp|@exp2|@log|@log2|@log10|@fabs|@floor|@ceil|@trunc|@round|@min|@max|@clamp)\b/, + 'stdlib': /\b(?:std\.transaction\.sender|std\.transaction\.origin|std\.transaction\.gasPrice|std\.transaction\.gasLimit|std\.block\.number|std\.block\.timestamp|std\.block\.difficulty|std\.block\.gaslimit|std\.block\.coinbase|std\.constants\.ZERO_ADDRESS|std\.constants\.MAX_UINT256|std\.math\.min|std\.math\.max|std\.math\.abs|std\.memory\.alloc|std\.memory\.free|std\.crypto\.keccak256|std\.crypto\.sha256|std\.crypto\.ripemd160|std\.crypto\.ecrecover|std\.storage\.get|std\.storage\.set|std\.events\.emit|std\.abi\.encode|std\.abi\.decode)\b/, + 'type': /\b(?:address|bytes|bytes32|uint256|u256|map|Array|Option|Result|Contract|Event|Function|Tuple|Union|Enum|Struct|Interface|Trait)\b/, + 'transfer-syntax': /\b(\w+)\s+(from)\s+(.+?)\s+(->)\s+(.+?)\s+(:)\s+(.+?)\b/, + 'operator': /->|[+\-*/%=<>!&|^~?:;.,\[\](){}]/, + 'number': /\b(?:0x[0-9a-fA-F]+|0b[01]+|0o[0-7]+|\d+(?:\.\d+)?(?:[eE][+-]?\d+)?)\b/, + 'punctuation': /[{}[\];(),.:]/, + 'function': /\b[a-zA-Z_][a-zA-Z0-9_]*(?=\s*\()/, + 'variable': /\b[a-zA-Z_][a-zA-Z0-9_]*\b/, + 'annotation': /@[a-zA-Z_][a-zA-Z0-9_]*/, + 'macro': /![a-zA-Z_][a-zA-Z0-9_]*/, + 'lifetime': /'[a-zA-Z_][a-zA-Z0-9_]*/, + 'error-type': /![a-zA-Z_][a-zA-Z0-9_]*\b/, + 'generic': /<[^>]+>/, + 'attribute': /#\[[^\]]+\]/ + }; +} \ No newline at end of file diff --git a/website/static/.nojekyll b/website/static/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/website/static/api-docs/index.html b/website/static/api-docs/index.html new file mode 100644 index 0000000..e60a3f9 --- /dev/null +++ b/website/static/api-docs/index.html @@ -0,0 +1,452 @@ + + + + + + Zig Documentation + + + + + + +
+

Loading...

+

[src]

+ + + + + + + + + + + + + + + +
+ + + + + + diff --git a/website/static/api-docs/main.js b/website/static/api-docs/main.js new file mode 100644 index 0000000..330b51b --- /dev/null +++ b/website/static/api-docs/main.js @@ -0,0 +1,1003 @@ +(function() { + const CAT_namespace = 0; + const CAT_container = 1; + const CAT_global_variable = 2; + const CAT_function = 3; + const CAT_primitive = 4; + const CAT_error_set = 5; + const CAT_global_const = 6; + const CAT_alias = 7; + const CAT_type = 8; + const CAT_type_type = 9; + const CAT_type_function = 10; + + const LOG_err = 0; + const LOG_warn = 1; + const LOG_info = 2; + const LOG_debug = 3; + + const domDocTestsCode = document.getElementById("docTestsCode"); + const domFnErrorsAnyError = document.getElementById("fnErrorsAnyError"); + const domFnProto = document.getElementById("fnProto"); + const domFnProtoCode = document.getElementById("fnProtoCode"); + const domHdrName = document.getElementById("hdrName"); + const domHelpModal = document.getElementById("helpDialog"); + const domListErrSets = document.getElementById("listErrSets"); + const domListFields = document.getElementById("listFields"); + const domListParams = document.getElementById("listParams"); + const domListFnErrors = document.getElementById("listFnErrors"); + const domListFns = document.getElementById("listFns"); + const domListGlobalVars = document.getElementById("listGlobalVars"); + const domListInfo = document.getElementById("listInfo"); + const domListNamespaces = document.getElementById("listNamespaces"); + const domListNav = document.getElementById("listNav"); + const domListSearchResults = document.getElementById("listSearchResults"); + const domListTypes = document.getElementById("listTypes"); + const domListValues = document.getElementById("listValues"); + const domSearch = document.getElementById("search"); + const domSectDocTests = document.getElementById("sectDocTests"); + const domSectErrSets = document.getElementById("sectErrSets"); + const domSectFields = document.getElementById("sectFields"); + const domSectParams = document.getElementById("sectParams"); + const domSectFnErrors = document.getElementById("sectFnErrors"); + const domSectFns = document.getElementById("sectFns"); + const domSectGlobalVars = document.getElementById("sectGlobalVars"); + const domSectNamespaces = document.getElementById("sectNamespaces"); + const domSectNav = document.getElementById("sectNav"); + const domSectSearchNoResults = document.getElementById("sectSearchNoResults"); + const domSectSearchResults = document.getElementById("sectSearchResults"); + const domSectSource = document.getElementById("sectSource"); + const domSectTypes = document.getElementById("sectTypes"); + const domSectValues = document.getElementById("sectValues"); + const domSourceText = document.getElementById("sourceText"); + const domStatus = document.getElementById("status"); + const domTableFnErrors = document.getElementById("tableFnErrors"); + const domTldDocs = document.getElementById("tldDocs"); + const domErrors = document.getElementById("errors"); + const domErrorsText = document.getElementById("errorsText"); + + var searchTimer = null; + + const curNav = { + // 0 = home + // 1 = decl (decl) + // 2 = source (path) + tag: 0, + // unsigned int: decl index + decl: null, + // string file name matching tarball path + path: null, + + // when this is populated, pressing the "view source" command will + // navigate to this hash. + viewSourceHash: null, + }; + var curNavSearch = ""; + var curSearchIndex = -1; + var imFeelingLucky = false; + + // names of modules in the same order as wasm + const moduleList = []; + + let wasm_promise = fetch("main.wasm"); + let sources_promise = fetch("sources.tar").then(function(response) { + if (!response.ok) throw new Error("unable to download sources"); + return response.arrayBuffer(); + }); + var wasm_exports = null; + + const text_decoder = new TextDecoder(); + const text_encoder = new TextEncoder(); + + WebAssembly.instantiateStreaming(wasm_promise, { + js: { + log: function(level, ptr, len) { + const msg = decodeString(ptr, len); + switch (level) { + case LOG_err: + console.error(msg); + domErrorsText.textContent += msg + "\n"; + domErrors.classList.remove("hidden"); + break; + case LOG_warn: + console.warn(msg); + break; + case LOG_info: + console.info(msg); + break; + case LOG_debug: + console.debug(msg); + break; + } + }, + }, + }).then(function(obj) { + wasm_exports = obj.instance.exports; + window.wasm = obj; // for debugging + + sources_promise.then(function(buffer) { + const js_array = new Uint8Array(buffer); + const ptr = wasm_exports.alloc(js_array.length); + const wasm_array = new Uint8Array(wasm_exports.memory.buffer, ptr, js_array.length); + wasm_array.set(js_array); + wasm_exports.unpack(ptr, js_array.length); + + updateModuleList(); + + window.addEventListener('popstate', onPopState, false); + domSearch.addEventListener('keydown', onSearchKeyDown, false); + domSearch.addEventListener('input', onSearchChange, false); + window.addEventListener('keydown', onWindowKeyDown, false); + onHashChange(null); + }); + }); + + function renderTitle() { + const suffix = " - Zig Documentation"; + if (curNavSearch.length > 0) { + document.title = curNavSearch + " - Search" + suffix; + } else if (curNav.decl != null) { + document.title = fullyQualifiedName(curNav.decl) + suffix; + } else if (curNav.path != null) { + document.title = curNav.path + suffix; + } else { + document.title = moduleList[0] + suffix; // Home + } + } + + function render() { + domFnErrorsAnyError.classList.add("hidden"); + domFnProto.classList.add("hidden"); + domHdrName.classList.add("hidden"); + domHelpModal.classList.add("hidden"); + domSectErrSets.classList.add("hidden"); + domSectDocTests.classList.add("hidden"); + domSectFields.classList.add("hidden"); + domSectParams.classList.add("hidden"); + domSectFnErrors.classList.add("hidden"); + domSectFns.classList.add("hidden"); + domSectGlobalVars.classList.add("hidden"); + domSectNamespaces.classList.add("hidden"); + domSectNav.classList.add("hidden"); + domSectSearchNoResults.classList.add("hidden"); + domSectSearchResults.classList.add("hidden"); + domSectSource.classList.add("hidden"); + domSectTypes.classList.add("hidden"); + domSectValues.classList.add("hidden"); + domStatus.classList.add("hidden"); + domTableFnErrors.classList.add("hidden"); + domTldDocs.classList.add("hidden"); + + renderTitle(); + + if (curNavSearch !== "") return renderSearch(); + + switch (curNav.tag) { + case 0: return renderHome(); + case 1: + if (curNav.decl == null) { + return renderNotFound(); + } else { + return renderDecl(curNav.decl); + } + case 2: return renderSource(curNav.path); + default: throw new Error("invalid navigation state"); + } + } + + function renderHome() { + if (moduleList.length == 0) { + domStatus.textContent = "sources.tar contains no modules"; + domStatus.classList.remove("hidden"); + return; + } + return renderModule(0); + } + + function renderModule(pkg_index) { + const root_decl = wasm_exports.find_module_root(pkg_index); + return renderDecl(root_decl); + } + + function renderDecl(decl_index) { + const category = wasm_exports.categorize_decl(decl_index, 0); + switch (category) { + case CAT_namespace: + case CAT_container: + return renderNamespacePage(decl_index); + case CAT_global_variable: + case CAT_primitive: + case CAT_global_const: + case CAT_type: + case CAT_type_type: + return renderGlobal(decl_index); + case CAT_function: + return renderFunction(decl_index); + case CAT_type_function: + return renderTypeFunction(decl_index); + case CAT_error_set: + return renderErrorSetPage(decl_index); + case CAT_alias: + return renderDecl(wasm_exports.get_aliasee()); + default: + throw new Error("unrecognized category " + category); + } + } + + function renderSource(path) { + const decl_index = findFileRoot(path); + if (decl_index == null) return renderNotFound(); + + renderNavFancy(decl_index, [{ + name: "[src]", + href: location.hash, + }]); + + domSourceText.innerHTML = declSourceHtml(decl_index); + + domSectSource.classList.remove("hidden"); + } + + function renderDeclHeading(decl_index) { + curNav.viewSourceHash = "#src/" + unwrapString(wasm_exports.decl_file_path(decl_index)); + + const hdrNameSpan = domHdrName.children[0]; + const srcLink = domHdrName.children[1]; + hdrNameSpan.innerText = unwrapString(wasm_exports.decl_category_name(decl_index)); + srcLink.setAttribute('href', curNav.viewSourceHash); + domHdrName.classList.remove("hidden"); + + renderTopLevelDocs(decl_index); + } + + function renderTopLevelDocs(decl_index) { + const tld_docs_html = unwrapString(wasm_exports.decl_docs_html(decl_index, false)); + if (tld_docs_html.length > 0) { + domTldDocs.innerHTML = tld_docs_html; + domTldDocs.classList.remove("hidden"); + } + } + + function renderNav(cur_nav_decl, list) { + return renderNavFancy(cur_nav_decl, []); + } + + function renderNavFancy(cur_nav_decl, list) { + { + // First, walk backwards the decl parents within a file. + let decl_it = cur_nav_decl; + let prev_decl_it = null; + while (decl_it != null) { + list.push({ + name: declIndexName(decl_it), + href: navLinkDeclIndex(decl_it), + }); + prev_decl_it = decl_it; + decl_it = declParent(decl_it); + } + + // Next, walk backwards the file path segments. + if (prev_decl_it != null) { + const file_path = fullyQualifiedName(prev_decl_it); + const parts = file_path.split("."); + parts.pop(); // skip last + for (;;) { + const href = navLinkFqn(parts.join(".")); + const part = parts.pop(); + if (!part) break; + list.push({ + name: part, + href: href, + }); + } + } + + list.reverse(); + } + resizeDomList(domListNav, list.length, '
  • '); + + for (let i = 0; i < list.length; i += 1) { + const liDom = domListNav.children[i]; + const aDom = liDom.children[0]; + aDom.textContent = list[i].name; + aDom.setAttribute('href', list[i].href); + if (i + 1 == list.length) { + aDom.classList.add("active"); + } else { + aDom.classList.remove("active"); + } + } + + domSectNav.classList.remove("hidden"); + } + + function renderNotFound() { + domStatus.textContent = "Declaration not found."; + domStatus.classList.remove("hidden"); + } + + function navLinkFqn(full_name) { + return '#' + full_name; + } + + function navLinkDeclIndex(decl_index) { + return navLinkFqn(fullyQualifiedName(decl_index)); + } + + function resizeDomList(listDom, desiredLen, templateHtml) { + // add the missing dom entries + var i, ev; + for (i = listDom.childElementCount; i < desiredLen; i += 1) { + listDom.insertAdjacentHTML('beforeend', templateHtml); + } + // remove extra dom entries + while (desiredLen < listDom.childElementCount) { + listDom.removeChild(listDom.lastChild); + } + } + + function renderErrorSetPage(decl_index) { + renderNav(decl_index); + renderDeclHeading(decl_index); + + const errorSetList = declErrorSet(decl_index).slice(); + renderErrorSet(decl_index, errorSetList); + } + + function renderErrorSet(base_decl, errorSetList) { + if (errorSetList == null) { + domFnErrorsAnyError.classList.remove("hidden"); + } else { + resizeDomList(domListFnErrors, errorSetList.length, '
    '); + for (let i = 0; i < errorSetList.length; i += 1) { + const divDom = domListFnErrors.children[i]; + const html = unwrapString(wasm_exports.error_html(base_decl, errorSetList[i])); + divDom.innerHTML = html; + } + domTableFnErrors.classList.remove("hidden"); + } + domSectFnErrors.classList.remove("hidden"); + } + + function renderParams(decl_index) { + // Prevent params from being emptied next time wasm calls memory.grow. + const params = declParams(decl_index).slice(); + if (params.length !== 0) { + resizeDomList(domListParams, params.length, '
    '); + for (let i = 0; i < params.length; i += 1) { + const divDom = domListParams.children[i]; + divDom.innerHTML = unwrapString(wasm_exports.decl_param_html(decl_index, params[i])); + } + domSectParams.classList.remove("hidden"); + } + } + + function renderTypeFunction(decl_index) { + renderNav(decl_index); + renderDeclHeading(decl_index); + renderTopLevelDocs(decl_index); + renderParams(decl_index); + renderDocTests(decl_index); + + const members = unwrapSlice32(wasm_exports.type_fn_members(decl_index, false)).slice(); + const fields = unwrapSlice32(wasm_exports.type_fn_fields(decl_index)).slice(); + if (members.length !== 0 || fields.length !== 0) { + renderNamespace(decl_index, members, fields); + } else { + domSourceText.innerHTML = declSourceHtml(decl_index); + domSectSource.classList.remove("hidden"); + } + } + + function renderDocTests(decl_index) { + const doctest_html = declDoctestHtml(decl_index); + if (doctest_html.length > 0) { + domDocTestsCode.innerHTML = doctest_html; + domSectDocTests.classList.remove("hidden"); + } + } + + function renderFunction(decl_index) { + renderNav(decl_index); + renderDeclHeading(decl_index); + renderTopLevelDocs(decl_index); + renderParams(decl_index); + renderDocTests(decl_index); + + domFnProtoCode.innerHTML = fnProtoHtml(decl_index, false); + domFnProto.classList.remove("hidden"); + + + const errorSetNode = fnErrorSet(decl_index); + if (errorSetNode != null) { + const base_decl = wasm_exports.fn_error_set_decl(decl_index, errorSetNode); + renderErrorSet(base_decl, errorSetNodeList(decl_index, errorSetNode)); + } + + domSourceText.innerHTML = declSourceHtml(decl_index); + domSectSource.classList.remove("hidden"); + } + + function renderGlobal(decl_index) { + renderNav(decl_index); + renderDeclHeading(decl_index); + + const docs_html = declDocsHtmlShort(decl_index); + if (docs_html.length > 0) { + domTldDocs.innerHTML = docs_html; + domTldDocs.classList.remove("hidden"); + } + + domSourceText.innerHTML = declSourceHtml(decl_index); + domSectSource.classList.remove("hidden"); + } + + function renderNamespace(base_decl, members, fields) { + const typesList = []; + const namespacesList = []; + const errSetsList = []; + const fnsList = []; + const varsList = []; + const valsList = []; + + member_loop: for (let i = 0; i < members.length; i += 1) { + let member = members[i]; + const original = member; + while (true) { + const member_category = wasm_exports.categorize_decl(member, 0); + switch (member_category) { + case CAT_namespace: + namespacesList.push({original: original, member: member}); + continue member_loop; + case CAT_container: + typesList.push({original: original, member: member}); + continue member_loop; + case CAT_global_variable: + varsList.push(member); + continue member_loop; + case CAT_function: + fnsList.push(member); + continue member_loop; + case CAT_type: + case CAT_type_type: + case CAT_type_function: + typesList.push({original: original, member: member}); + continue member_loop; + case CAT_error_set: + errSetsList.push({original: original, member: member}); + continue member_loop; + case CAT_global_const: + case CAT_primitive: + valsList.push({original: original, member: member}); + continue member_loop; + case CAT_alias: + member = wasm_exports.get_aliasee(); + continue; + default: + throw new Error("uknown category: " + member_category); + } + } + } + + typesList.sort(byDeclIndexName2); + namespacesList.sort(byDeclIndexName2); + errSetsList.sort(byDeclIndexName2); + fnsList.sort(byDeclIndexName); + varsList.sort(byDeclIndexName); + valsList.sort(byDeclIndexName2); + + if (typesList.length !== 0) { + resizeDomList(domListTypes, typesList.length, '
  • '); + for (let i = 0; i < typesList.length; i += 1) { + const liDom = domListTypes.children[i]; + const aDom = liDom.children[0]; + const original_decl = typesList[i].original; + const decl = typesList[i].member; + aDom.textContent = declIndexName(original_decl); + aDom.setAttribute('href', navLinkDeclIndex(decl)); + } + domSectTypes.classList.remove("hidden"); + } + if (namespacesList.length !== 0) { + resizeDomList(domListNamespaces, namespacesList.length, '
  • '); + for (let i = 0; i < namespacesList.length; i += 1) { + const liDom = domListNamespaces.children[i]; + const aDom = liDom.children[0]; + const original_decl = namespacesList[i].original; + const decl = namespacesList[i].member; + aDom.textContent = declIndexName(original_decl); + aDom.setAttribute('href', navLinkDeclIndex(decl)); + } + domSectNamespaces.classList.remove("hidden"); + } + + if (errSetsList.length !== 0) { + resizeDomList(domListErrSets, errSetsList.length, '
  • '); + for (let i = 0; i < errSetsList.length; i += 1) { + const liDom = domListErrSets.children[i]; + const aDom = liDom.children[0]; + const original_decl = errSetsList[i].original; + const decl = errSetsList[i].member; + aDom.textContent = declIndexName(original_decl); + aDom.setAttribute('href', navLinkDeclIndex(decl)); + } + domSectErrSets.classList.remove("hidden"); + } + + if (fnsList.length !== 0) { + resizeDomList(domListFns, fnsList.length, + '
    '); + for (let i = 0; i < fnsList.length; i += 1) { + const decl = fnsList[i]; + const divDom = domListFns.children[i]; + + const dtDom = divDom.children[0]; + const ddDocs = divDom.children[1]; + const protoCodeDom = dtDom.children[0]; + + protoCodeDom.innerHTML = fnProtoHtml(decl, true); + ddDocs.innerHTML = declDocsHtmlShort(decl); + } + domSectFns.classList.remove("hidden"); + } + + if (fields.length !== 0) { + resizeDomList(domListFields, fields.length, '
    '); + for (let i = 0; i < fields.length; i += 1) { + const divDom = domListFields.children[i]; + divDom.innerHTML = unwrapString(wasm_exports.decl_field_html(base_decl, fields[i])); + } + domSectFields.classList.remove("hidden"); + } + + if (varsList.length !== 0) { + resizeDomList(domListGlobalVars, varsList.length, + ''); + for (let i = 0; i < varsList.length; i += 1) { + const decl = varsList[i]; + const trDom = domListGlobalVars.children[i]; + + const tdName = trDom.children[0]; + const tdNameA = tdName.children[0]; + const tdType = trDom.children[1]; + const tdDesc = trDom.children[2]; + + tdNameA.setAttribute('href', navLinkDeclIndex(decl)); + tdNameA.textContent = declIndexName(decl); + + tdType.innerHTML = declTypeHtml(decl); + tdDesc.innerHTML = declDocsHtmlShort(decl); + } + domSectGlobalVars.classList.remove("hidden"); + } + + if (valsList.length !== 0) { + resizeDomList(domListValues, valsList.length, + ''); + for (let i = 0; i < valsList.length; i += 1) { + const trDom = domListValues.children[i]; + const tdName = trDom.children[0]; + const tdNameA = tdName.children[0]; + const tdType = trDom.children[1]; + const tdDesc = trDom.children[2]; + + const original_decl = valsList[i].original; + const decl = valsList[i].member; + tdNameA.setAttribute('href', navLinkDeclIndex(decl)); + tdNameA.textContent = declIndexName(original_decl); + + tdType.innerHTML = declTypeHtml(decl); + tdDesc.innerHTML = declDocsHtmlShort(decl); + } + domSectValues.classList.remove("hidden"); + } + } + + function renderNamespacePage(decl_index) { + renderNav(decl_index); + renderDeclHeading(decl_index); + const members = namespaceMembers(decl_index, false).slice(); + const fields = declFields(decl_index).slice(); + renderNamespace(decl_index, members, fields); + } + + function operatorCompare(a, b) { + if (a === b) { + return 0; + } else if (a < b) { + return -1; + } else { + return 1; + } + } + + function updateCurNav(location_hash) { + curNav.tag = 0; + curNav.decl = null; + curNav.path = null; + curNav.viewSourceHash = null; + curNavSearch = ""; + + if (location_hash.length > 1 && location_hash[0] === '#') { + const query = location_hash.substring(1); + const qpos = query.indexOf("?"); + let nonSearchPart; + if (qpos === -1) { + nonSearchPart = query; + } else { + nonSearchPart = query.substring(0, qpos); + curNavSearch = decodeURIComponent(query.substring(qpos + 1)); + } + + if (nonSearchPart.length > 0) { + const source_mode = nonSearchPart.startsWith("src/"); + if (source_mode) { + curNav.tag = 2; + curNav.path = nonSearchPart.substring(4); + } else { + curNav.tag = 1; + curNav.decl = findDecl(nonSearchPart); + } + } + } + } + + function onHashChange(state) { + history.replaceState({}, ""); + navigate(location.hash); + if (state == null) window.scrollTo({top: 0}); + } + + function onPopState(ev) { + onHashChange(ev.state); + } + + function navigate(location_hash) { + updateCurNav(location_hash); + if (domSearch.value !== curNavSearch) { + domSearch.value = curNavSearch; + } + render(); + if (imFeelingLucky) { + imFeelingLucky = false; + activateSelectedResult(); + } + } + + function activateSelectedResult() { + if (domSectSearchResults.classList.contains("hidden")) { + return; + } + + var liDom = domListSearchResults.children[curSearchIndex]; + if (liDom == null && domListSearchResults.children.length !== 0) { + liDom = domListSearchResults.children[0]; + } + if (liDom != null) { + var aDom = liDom.children[0]; + location.href = aDom.getAttribute("href"); + curSearchIndex = -1; + } + domSearch.blur(); + } + + function onSearchKeyDown(ev) { + switch (ev.code) { + case "Enter": + if (ev.shiftKey || ev.ctrlKey || ev.altKey) return; + + clearAsyncSearch(); + imFeelingLucky = true; + location.hash = computeSearchHash(); + + ev.preventDefault(); + ev.stopPropagation(); + return; + case "Escape": + if (ev.shiftKey || ev.ctrlKey || ev.altKey) return; + + domSearch.value = ""; + domSearch.blur(); + curSearchIndex = -1; + ev.preventDefault(); + ev.stopPropagation(); + startSearch(); + return; + case "ArrowUp": + if (ev.shiftKey || ev.ctrlKey || ev.altKey) return; + + moveSearchCursor(-1); + ev.preventDefault(); + ev.stopPropagation(); + return; + case "ArrowDown": + if (ev.shiftKey || ev.ctrlKey || ev.altKey) return; + + moveSearchCursor(1); + ev.preventDefault(); + ev.stopPropagation(); + return; + default: + ev.stopPropagation(); // prevent keyboard shortcuts + return; + } + } + + function onSearchChange(ev) { + curSearchIndex = -1; + startAsyncSearch(); + } + + function moveSearchCursor(dir) { + if (curSearchIndex < 0 || curSearchIndex >= domListSearchResults.children.length) { + if (dir > 0) { + curSearchIndex = -1 + dir; + } else if (dir < 0) { + curSearchIndex = domListSearchResults.children.length + dir; + } + } else { + curSearchIndex += dir; + } + if (curSearchIndex < 0) { + curSearchIndex = 0; + } + if (curSearchIndex >= domListSearchResults.children.length) { + curSearchIndex = domListSearchResults.children.length - 1; + } + renderSearchCursor(); + } + + function onWindowKeyDown(ev) { + switch (ev.code) { + case "Escape": + if (ev.shiftKey || ev.ctrlKey || ev.altKey) return; + if (!domHelpModal.classList.contains("hidden")) { + domHelpModal.classList.add("hidden"); + ev.preventDefault(); + ev.stopPropagation(); + } + break; + case "KeyS": + if (ev.shiftKey || ev.ctrlKey || ev.altKey) return; + domSearch.focus(); + domSearch.select(); + ev.preventDefault(); + ev.stopPropagation(); + startAsyncSearch(); + break; + case "KeyU": + if (ev.shiftKey || ev.ctrlKey || ev.altKey) return; + ev.preventDefault(); + ev.stopPropagation(); + navigateToSource(); + break; + case "Slash": + if (!ev.shiftKey || ev.ctrlKey || ev.altKey) return; + ev.preventDefault(); + ev.stopPropagation(); + showHelpModal(); + break; + } + } + + function showHelpModal() { + domHelpModal.classList.remove("hidden"); + domHelpModal.style.left = (window.innerWidth / 2 - domHelpModal.clientWidth / 2) + "px"; + domHelpModal.style.top = (window.innerHeight / 2 - domHelpModal.clientHeight / 2) + "px"; + domHelpModal.focus(); + } + + function navigateToSource() { + if (curNav.viewSourceHash != null) { + location.hash = curNav.viewSourceHash; + } + } + + function clearAsyncSearch() { + if (searchTimer != null) { + clearTimeout(searchTimer); + searchTimer = null; + } + } + + function startAsyncSearch() { + clearAsyncSearch(); + searchTimer = setTimeout(startSearch, 10); + } + function computeSearchHash() { + // How location.hash works: + // 1. http://example.com/ => "" + // 2. http://example.com/# => "" + // 3. http://example.com/#foo => "#foo" + // wat + const oldWatHash = location.hash; + const oldHash = oldWatHash.startsWith("#") ? oldWatHash : "#" + oldWatHash; + const parts = oldHash.split("?"); + const newPart2 = (domSearch.value === "") ? "" : ("?" + domSearch.value); + return parts[0] + newPart2; + } + function startSearch() { + clearAsyncSearch(); + navigate(computeSearchHash()); + } + function renderSearch() { + renderNav(curNav.decl); + + const ignoreCase = (curNavSearch.toLowerCase() === curNavSearch); + const results = executeQuery(curNavSearch, ignoreCase); + + if (results.length !== 0) { + resizeDomList(domListSearchResults, results.length, '
  • '); + + for (let i = 0; i < results.length; i += 1) { + const liDom = domListSearchResults.children[i]; + const aDom = liDom.children[0]; + const match = results[i]; + const full_name = fullyQualifiedName(match); + aDom.textContent = full_name; + aDom.setAttribute('href', navLinkFqn(full_name)); + } + renderSearchCursor(); + + domSectSearchResults.classList.remove("hidden"); + } else { + domSectSearchNoResults.classList.remove("hidden"); + } + } + + function renderSearchCursor() { + for (let i = 0; i < domListSearchResults.children.length; i += 1) { + var liDom = domListSearchResults.children[i]; + if (curSearchIndex === i) { + liDom.classList.add("selected"); + } else { + liDom.classList.remove("selected"); + } + } + } + + function updateModuleList() { + moduleList.length = 0; + for (let i = 0;; i += 1) { + const name = unwrapString(wasm_exports.module_name(i)); + if (name.length == 0) break; + moduleList.push(name); + } + } + + function byDeclIndexName(a, b) { + const a_name = declIndexName(a); + const b_name = declIndexName(b); + return operatorCompare(a_name, b_name); + } + + function byDeclIndexName2(a, b) { + const a_name = declIndexName(a.original); + const b_name = declIndexName(b.original); + return operatorCompare(a_name, b_name); + } + + function decodeString(ptr, len) { + if (len === 0) return ""; + return text_decoder.decode(new Uint8Array(wasm_exports.memory.buffer, ptr, len)); + } + + function unwrapString(bigint) { + const ptr = Number(bigint & 0xffffffffn); + const len = Number(bigint >> 32n); + return decodeString(ptr, len); + } + + function declTypeHtml(decl_index) { + return unwrapString(wasm_exports.decl_type_html(decl_index)); + } + + function declDocsHtmlShort(decl_index) { + return unwrapString(wasm_exports.decl_docs_html(decl_index, true)); + } + + function fullyQualifiedName(decl_index) { + return unwrapString(wasm_exports.decl_fqn(decl_index)); + } + + function declIndexName(decl_index) { + return unwrapString(wasm_exports.decl_name(decl_index)); + } + + function declSourceHtml(decl_index) { + return unwrapString(wasm_exports.decl_source_html(decl_index)); + } + + function declDoctestHtml(decl_index) { + return unwrapString(wasm_exports.decl_doctest_html(decl_index)); + } + + function fnProtoHtml(decl_index, linkify_fn_name) { + return unwrapString(wasm_exports.decl_fn_proto_html(decl_index, linkify_fn_name)); + } + + function setQueryString(s) { + const jsArray = text_encoder.encode(s); + const len = jsArray.length; + const ptr = wasm_exports.query_begin(len); + const wasmArray = new Uint8Array(wasm_exports.memory.buffer, ptr, len); + wasmArray.set(jsArray); + } + + function executeQuery(query_string, ignore_case) { + setQueryString(query_string); + const ptr = wasm_exports.query_exec(ignore_case); + const head = new Uint32Array(wasm_exports.memory.buffer, ptr, 1); + const len = head[0]; + return new Uint32Array(wasm_exports.memory.buffer, ptr + 4, len); + } + + function namespaceMembers(decl_index, include_private) { + return unwrapSlice32(wasm_exports.namespace_members(decl_index, include_private)); + } + + function declFields(decl_index) { + return unwrapSlice32(wasm_exports.decl_fields(decl_index)); + } + + function declParams(decl_index) { + return unwrapSlice32(wasm_exports.decl_params(decl_index)); + } + + function declErrorSet(decl_index) { + return unwrapSlice64(wasm_exports.decl_error_set(decl_index)); + } + + function errorSetNodeList(base_decl, err_set_node) { + return unwrapSlice64(wasm_exports.error_set_node_list(base_decl, err_set_node)); + } + + function unwrapSlice32(bigint) { + const ptr = Number(bigint & 0xffffffffn); + const len = Number(bigint >> 32n); + if (len === 0) return []; + return new Uint32Array(wasm_exports.memory.buffer, ptr, len); + } + + function unwrapSlice64(bigint) { + const ptr = Number(bigint & 0xffffffffn); + const len = Number(bigint >> 32n); + if (len === 0) return []; + return new BigUint64Array(wasm_exports.memory.buffer, ptr, len); + } + + function findDecl(fqn) { + setInputString(fqn); + const result = wasm_exports.find_decl(); + if (result === -1) return null; + return result; + } + + function findFileRoot(path) { + setInputString(path); + const result = wasm_exports.find_file_root(); + if (result === -1) return null; + return result; + } + + function declParent(decl_index) { + const result = wasm_exports.decl_parent(decl_index); + if (result === -1) return null; + return result; + } + + function fnErrorSet(decl_index) { + const result = wasm_exports.fn_error_set(decl_index); + if (result === 0) return null; + return result; + } + + function setInputString(s) { + const jsArray = text_encoder.encode(s); + const len = jsArray.length; + const ptr = wasm_exports.set_input_string(len); + const wasmArray = new Uint8Array(wasm_exports.memory.buffer, ptr, len); + wasmArray.set(jsArray); + } +})(); + diff --git a/website/static/api-docs/main.wasm b/website/static/api-docs/main.wasm new file mode 100755 index 0000000..023ed26 Binary files /dev/null and b/website/static/api-docs/main.wasm differ diff --git a/website/static/api-docs/sources.tar b/website/static/api-docs/sources.tar new file mode 100644 index 0000000..d273066 Binary files /dev/null and b/website/static/api-docs/sources.tar differ diff --git a/website/static/img/docusaurus-social-card.jpg b/website/static/img/docusaurus-social-card.jpg new file mode 100644 index 0000000..ffcb448 Binary files /dev/null and b/website/static/img/docusaurus-social-card.jpg differ diff --git a/website/static/img/docusaurus.png b/website/static/img/docusaurus.png new file mode 100644 index 0000000..f458149 Binary files /dev/null and b/website/static/img/docusaurus.png differ diff --git a/website/static/img/favicon.ico b/website/static/img/favicon.ico new file mode 100644 index 0000000..c01d54b Binary files /dev/null and b/website/static/img/favicon.ico differ diff --git a/website/static/img/logo.svg b/website/static/img/logo.svg new file mode 100644 index 0000000..9db6d0d --- /dev/null +++ b/website/static/img/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/static/img/undraw_docusaurus_mountain.svg b/website/static/img/undraw_docusaurus_mountain.svg new file mode 100644 index 0000000..af961c4 --- /dev/null +++ b/website/static/img/undraw_docusaurus_mountain.svg @@ -0,0 +1,171 @@ + + Easy to Use + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/website/static/img/undraw_docusaurus_react.svg b/website/static/img/undraw_docusaurus_react.svg new file mode 100644 index 0000000..94b5cf0 --- /dev/null +++ b/website/static/img/undraw_docusaurus_react.svg @@ -0,0 +1,170 @@ + + Powered by React + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/website/static/img/undraw_docusaurus_tree.svg b/website/static/img/undraw_docusaurus_tree.svg new file mode 100644 index 0000000..d9161d3 --- /dev/null +++ b/website/static/img/undraw_docusaurus_tree.svg @@ -0,0 +1,40 @@ + + Focus on What Matters + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/website/tsconfig.json b/website/tsconfig.json new file mode 100644 index 0000000..920d7a6 --- /dev/null +++ b/website/tsconfig.json @@ -0,0 +1,8 @@ +{ + // This file is not used in compilation. It is here just for a nice editor experience. + "extends": "@docusaurus/tsconfig", + "compilerOptions": { + "baseUrl": "." + }, + "exclude": [".docusaurus", "build"] +}