mirror of
				https://github.com/firefly-iii/firefly-iii.git
				synced 2025-10-31 10:47:00 +00:00 
			
		
		
		
	Merge pull request #10281 from firefly-iii/release-1746961196
🤖 Automatically merge the PR into the develop branch.
			
			
This commit is contained in:
		| @@ -39,8 +39,8 @@ class CorrectsUnevenAmount extends Command | ||||
| { | ||||
|     use ShowsFriendlyMessages; | ||||
| 
 | ||||
|     protected   $description = 'Fix journals with uneven amounts.'; | ||||
|     protected   $signature   = 'correction:uneven-amounts'; | ||||
|     protected $description = 'Fix journals with uneven amounts.'; | ||||
|     protected $signature   = 'correction:uneven-amounts'; | ||||
|     private int $count; | ||||
| 
 | ||||
|     /** | ||||
| @@ -71,17 +71,18 @@ class CorrectsUnevenAmount extends Command | ||||
|         Log::debug('convertOldStyleTransfers()'); | ||||
|         // select transactions with a foreign amount and a foreign currency. and it's a transfer. and they are different.
 | ||||
|         $transactions = Transaction::distinct() | ||||
|                                    ->leftJoin('transaction_journals', 'transaction_journals.id', 'transactions.transaction_journal_id') | ||||
|                                    ->leftJoin('transaction_types', 'transaction_types.id', 'transaction_journals.transaction_type_id') | ||||
|                                    ->where('transaction_types.type', TransactionTypeEnum::TRANSFER->value) | ||||
|                                    ->whereNotNull('foreign_currency_id') | ||||
|                                    ->whereNotNull('foreign_amount')->get(['transactions.transaction_journal_id']); | ||||
|             ->leftJoin('transaction_journals', 'transaction_journals.id', 'transactions.transaction_journal_id') | ||||
|             ->leftJoin('transaction_types', 'transaction_types.id', 'transaction_journals.transaction_type_id') | ||||
|             ->where('transaction_types.type', TransactionTypeEnum::TRANSFER->value) | ||||
|             ->whereNotNull('foreign_currency_id') | ||||
|             ->whereNotNull('foreign_amount')->get(['transactions.transaction_journal_id']) | ||||
|         ; | ||||
|         $count        = 0; | ||||
| 
 | ||||
|         /** @var Transaction $transaction */ | ||||
|         foreach ($transactions as $transaction) { | ||||
|             /** @var null|TransactionJournal $journal */ | ||||
|             $journal = TransactionJournal::find($transaction->transaction_journal_id); | ||||
|             $journal     = TransactionJournal::find($transaction->transaction_journal_id); | ||||
|             if (null === $journal) { | ||||
|                 Log::debug('Found no journal, continue.'); | ||||
| 
 | ||||
| @@ -98,7 +99,7 @@ class CorrectsUnevenAmount extends Command | ||||
|             $destination = $journal->transactions()->where('amount', '>', 0)->first(); | ||||
| 
 | ||||
|             /** @var null|Transaction $source */ | ||||
|             $source = $journal->transactions()->where('amount', '<', 0)->first(); | ||||
|             $source      = $journal->transactions()->where('amount', '<', 0)->first(); | ||||
|             if (null === $destination || null === $source) { | ||||
|                 Log::debug('Source or destination transaction is NULL, continue.'); | ||||
| 
 | ||||
| @@ -129,9 +130,10 @@ class CorrectsUnevenAmount extends Command | ||||
|     { | ||||
|         Log::debug('fixUnevenAmounts()'); | ||||
|         $journals = DB::table('transactions') | ||||
|                       ->groupBy('transaction_journal_id') | ||||
|                       ->whereNull('deleted_at') | ||||
|                       ->get(['transaction_journal_id', DB::raw('SUM(amount) AS the_sum')]); | ||||
|             ->groupBy('transaction_journal_id') | ||||
|             ->whereNull('deleted_at') | ||||
|             ->get(['transaction_journal_id', DB::raw('SUM(amount) AS the_sum')]) | ||||
|         ; | ||||
| 
 | ||||
|         /** @var \stdClass $entry */ | ||||
|         foreach ($journals as $entry) { | ||||
| @@ -169,13 +171,13 @@ class CorrectsUnevenAmount extends Command | ||||
|     private function fixJournal(int $param): void | ||||
|     { | ||||
|         // one of the transactions is bad.
 | ||||
|         $journal = TransactionJournal::find($param); | ||||
|         $journal             = TransactionJournal::find($param); | ||||
|         if (null === $journal) { | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         /** @var null|Transaction $source */ | ||||
|         $source = $journal->transactions()->where('amount', '<', 0)->first(); | ||||
|         $source              = $journal->transactions()->where('amount', '<', 0)->first(); | ||||
| 
 | ||||
|         if (null === $source) { | ||||
|             $this->friendlyError( | ||||
| @@ -192,11 +194,11 @@ class CorrectsUnevenAmount extends Command | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         $amount = bcmul('-1', (string) $source->amount); | ||||
|         $amount              = bcmul('-1', (string) $source->amount); | ||||
| 
 | ||||
|         // fix amount of destination:
 | ||||
|         /** @var null|Transaction $destination */ | ||||
|         $destination = $journal->transactions()->where('amount', '>', 0)->first(); | ||||
|         $destination         = $journal->transactions()->where('amount', '>', 0)->first(); | ||||
| 
 | ||||
|         if (null === $destination) { | ||||
|             $this->friendlyError( | ||||
| @@ -221,7 +223,7 @@ class CorrectsUnevenAmount extends Command | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         $message = sprintf('Sum of journal #%d is not zero, journal is broken and now fixed.', $journal->id); | ||||
|         $message             = sprintf('Sum of journal #%d is not zero, journal is broken and now fixed.', $journal->id); | ||||
| 
 | ||||
|         $this->friendlyWarning($message); | ||||
|         app('log')->warning($message); | ||||
| @@ -229,7 +231,7 @@ class CorrectsUnevenAmount extends Command | ||||
|         $destination->amount = $amount; | ||||
|         $destination->save(); | ||||
| 
 | ||||
|         $message = sprintf('Corrected amount in transaction journal #%d', $param); | ||||
|         $message             = sprintf('Corrected amount in transaction journal #%d', $param); | ||||
|         $this->friendlyInfo($message); | ||||
|         ++$this->count; | ||||
|     } | ||||
| @@ -244,7 +246,7 @@ class CorrectsUnevenAmount extends Command | ||||
|         $destination = $journal->transactions()->where('amount', '>', 0)->first(); | ||||
| 
 | ||||
|         /** @var Transaction $source */ | ||||
|         $source = $journal->transactions()->where('amount', '<', 0)->first(); | ||||
|         $source      = $journal->transactions()->where('amount', '<', 0)->first(); | ||||
| 
 | ||||
|         // safety catch on NULL should not be necessary, we just had that catch.
 | ||||
|         // source amount = dest foreign amount
 | ||||
| @@ -271,10 +273,11 @@ class CorrectsUnevenAmount extends Command | ||||
|     private function matchCurrencies(): void | ||||
|     { | ||||
|         $journals = TransactionJournal::leftJoin('transactions', 'transaction_journals.id', 'transactions.transaction_journal_id') | ||||
|                                       ->where('transactions.transaction_currency_id', '!=', DB::raw('transaction_journals.transaction_currency_id')) | ||||
|                                       ->get(['transaction_journals.*']); | ||||
|             ->where('transactions.transaction_currency_id', '!=', DB::raw('transaction_journals.transaction_currency_id')) | ||||
|             ->get(['transaction_journals.*']) | ||||
|         ; | ||||
| 
 | ||||
|         $count = 0; | ||||
|         $count    = 0; | ||||
| 
 | ||||
|         /** @var TransactionJournal $journal */ | ||||
|         foreach ($journals as $journal) { | ||||
| @@ -296,37 +299,44 @@ class CorrectsUnevenAmount extends Command | ||||
|     private function isBetweenAssetAndLiability(TransactionJournal $journal): bool | ||||
|     { | ||||
|         /** @var Transaction $sourceTransaction */ | ||||
|         $sourceTransaction = $journal->transactions()->where('amount', '<', 0)->first(); | ||||
|         $sourceTransaction      = $journal->transactions()->where('amount', '<', 0)->first(); | ||||
| 
 | ||||
|         /** @var Transaction $destinationTransaction */ | ||||
|         $destinationTransaction = $journal->transactions()->where('amount', '>', 0)->first(); | ||||
|         if (null === $sourceTransaction || null === $destinationTransaction) { | ||||
|             Log::warning('Either transaction is false, stop.'); | ||||
| 
 | ||||
|             return false; | ||||
|         } | ||||
|         if (null === $sourceTransaction->foreign_amount || null === $destinationTransaction->foreign_amount) { | ||||
|             Log::warning('Either foreign amount is false, stop.'); | ||||
| 
 | ||||
|             return false; | ||||
|         } | ||||
| 
 | ||||
|         $source      = $sourceTransaction->account; | ||||
|         $destination = $destinationTransaction->account; | ||||
|         $source                 = $sourceTransaction->account; | ||||
|         $destination            = $destinationTransaction->account; | ||||
| 
 | ||||
|         if (null === $source || null === $destination) { | ||||
|             Log::warning('Either is false, stop.'); | ||||
| 
 | ||||
|             return false; | ||||
|         } | ||||
|         $sourceTypes = [AccountTypeEnum::LOAN->value, AccountTypeEnum::DEBT->value, AccountTypeEnum::MORTGAGE->value]; | ||||
|         $sourceTypes            = [AccountTypeEnum::LOAN->value, AccountTypeEnum::DEBT->value, AccountTypeEnum::MORTGAGE->value]; | ||||
| 
 | ||||
|         // source is liability, destination is asset
 | ||||
|         if (in_array($source->accountType->type, $sourceTypes, true) && AccountTypeEnum::ASSET->value === $destination->accountType->type) { | ||||
|             Log::debug('Source is a liability account, destination is an asset account, return TRUE.'); | ||||
| 
 | ||||
|             return true; | ||||
|         } | ||||
|         // source is asset, destination is liability
 | ||||
|         if (in_array($destination->accountType->type, $sourceTypes, true) && AccountTypeEnum::ASSET->value === $source->accountType->type) { | ||||
|             Log::debug('Destination is a liability account, source is an asset account, return TRUE.'); | ||||
| 
 | ||||
|             return true; | ||||
|         } | ||||
| 
 | ||||
|         return false; | ||||
|     } | ||||
| 
 | ||||
| @@ -334,24 +344,25 @@ class CorrectsUnevenAmount extends Command | ||||
|     { | ||||
| 
 | ||||
|         /** @var AccountRepositoryInterface $repository */ | ||||
|         $repository = app(AccountRepositoryInterface::class); | ||||
|         $repository   = app(AccountRepositoryInterface::class); | ||||
|         Log::debug('convertOldStyleTransactions()'); | ||||
|         $count        = 0; | ||||
|         $transactions = Transaction::distinct() | ||||
|                                    ->leftJoin('transaction_journals', 'transaction_journals.id', 'transactions.transaction_journal_id') | ||||
|                                    ->leftJoin('transaction_types', 'transaction_types.id', 'transaction_journals.transaction_type_id') | ||||
|                                    ->leftJoin('accounts', 'accounts.id', 'transactions.account_id') | ||||
|                                    ->leftJoin('account_types', 'account_types.id', 'accounts.account_type_id') | ||||
|                                    ->whereNot('transaction_types.type', TransactionTypeEnum::TRANSFER->value) | ||||
|                                    ->whereNotNull('foreign_currency_id') | ||||
|                                    ->whereNotNull('foreign_amount') | ||||
|                                    ->whereIn('account_types.type', [AccountTypeEnum::ASSET->value, AccountTypeEnum::DEBT->value, AccountTypeEnum::MORTGAGE->value, AccountTypeEnum::LOAN->value]) | ||||
|                                    ->get(['transactions.transaction_journal_id']); | ||||
|             ->leftJoin('transaction_journals', 'transaction_journals.id', 'transactions.transaction_journal_id') | ||||
|             ->leftJoin('transaction_types', 'transaction_types.id', 'transaction_journals.transaction_type_id') | ||||
|             ->leftJoin('accounts', 'accounts.id', 'transactions.account_id') | ||||
|             ->leftJoin('account_types', 'account_types.id', 'accounts.account_type_id') | ||||
|             ->whereNot('transaction_types.type', TransactionTypeEnum::TRANSFER->value) | ||||
|             ->whereNotNull('foreign_currency_id') | ||||
|             ->whereNotNull('foreign_amount') | ||||
|             ->whereIn('account_types.type', [AccountTypeEnum::ASSET->value, AccountTypeEnum::DEBT->value, AccountTypeEnum::MORTGAGE->value, AccountTypeEnum::LOAN->value]) | ||||
|             ->get(['transactions.transaction_journal_id']) | ||||
|         ; | ||||
| 
 | ||||
|         /** @var Transaction $transaction */ | ||||
|         foreach ($transactions as $transaction) { | ||||
|             /** @var null|TransactionJournal $journal */ | ||||
|             $journal = TransactionJournal::find($transaction->transaction_journal_id); | ||||
|             $journal        = TransactionJournal::find($transaction->transaction_journal_id); | ||||
|             $repository->setUser($journal->user); | ||||
|             if (null === $journal) { | ||||
|                 Log::debug('Found no journal, continue.'); | ||||
| @@ -391,10 +402,10 @@ class CorrectsUnevenAmount extends Command | ||||
|                 $source->foreign_currency_id     = $currency; | ||||
|                 $source->saveQuietly(); | ||||
|                 $source->refresh(); | ||||
| //                Log::debug(sprintf('source->amount                  = %s', $source->amount));
 | ||||
| //                Log::debug(sprintf('source->transaction_currency_id = %s', $source->transaction_currency_id));
 | ||||
| //                Log::debug(sprintf('source->foreign_amount          = %s', $source->foreign_amount));
 | ||||
| //                Log::debug(sprintf('source->foreign_currency_id     = %s', $source->foreign_currency_id));
 | ||||
|                 //                Log::debug(sprintf('source->amount                  = %s', $source->amount));
 | ||||
|                 //                Log::debug(sprintf('source->transaction_currency_id = %s', $source->transaction_currency_id));
 | ||||
|                 //                Log::debug(sprintf('source->foreign_amount          = %s', $source->foreign_amount));
 | ||||
|                 //                Log::debug(sprintf('source->foreign_currency_id     = %s', $source->foreign_currency_id));
 | ||||
|                 ++$count; | ||||
|             } | ||||
|             // same but for destination
 | ||||
| @@ -411,23 +422,23 @@ class CorrectsUnevenAmount extends Command | ||||
|                 $destination->balance_dirty           = true; | ||||
|                 $destination->saveQuietly(); | ||||
|                 $destination->refresh(); | ||||
| //                Log::debug(sprintf('destination->amount                  = %s', $destination->amount));
 | ||||
| //                Log::debug(sprintf('destination->transaction_currency_id = %s', $destination->transaction_currency_id));
 | ||||
| //                Log::debug(sprintf('destination->foreign_amount          = %s', $destination->foreign_amount));
 | ||||
| //                Log::debug(sprintf('destination->foreign_currency_id     = %s', $destination->foreign_currency_id));
 | ||||
|                 //                Log::debug(sprintf('destination->amount                  = %s', $destination->amount));
 | ||||
|                 //                Log::debug(sprintf('destination->transaction_currency_id = %s', $destination->transaction_currency_id));
 | ||||
|                 //                Log::debug(sprintf('destination->foreign_amount          = %s', $destination->foreign_amount));
 | ||||
|                 //                Log::debug(sprintf('destination->foreign_currency_id     = %s', $destination->foreign_currency_id));
 | ||||
|             } | ||||
| 
 | ||||
| 
 | ||||
| //            // only fix the destination transaction
 | ||||
| //            $destination->foreign_currency_id     = $source->transaction_currency_id;
 | ||||
| //            $destination->foreign_amount          = app('steam')->positive($source->amount);
 | ||||
| //            $destination->transaction_currency_id = $source->foreign_currency_id;
 | ||||
| //            $destination->amount                  = app('steam')->positive($source->foreign_amount);
 | ||||
| //            $destination->balance_dirty           = true;
 | ||||
| //            $source->balance_dirty                = true;
 | ||||
| //            $destination->save();
 | ||||
| //            $source->save();
 | ||||
| //            $this->friendlyWarning(sprintf('Corrected foreign amounts of transaction #%d.', $journal->id));
 | ||||
|             //            // only fix the destination transaction
 | ||||
|             //            $destination->foreign_currency_id     = $source->transaction_currency_id;
 | ||||
|             //            $destination->foreign_amount          = app('steam')->positive($source->amount);
 | ||||
|             //            $destination->transaction_currency_id = $source->foreign_currency_id;
 | ||||
|             //            $destination->amount                  = app('steam')->positive($source->foreign_amount);
 | ||||
|             //            $destination->balance_dirty           = true;
 | ||||
|             //            $source->balance_dirty                = true;
 | ||||
|             //            $destination->save();
 | ||||
|             //            $source->save();
 | ||||
|             //            $this->friendlyWarning(sprintf('Corrected foreign amounts of transaction #%d.', $journal->id));
 | ||||
|         } | ||||
|         if (0 === $count) { | ||||
|             return; | ||||
|   | ||||
| @@ -104,7 +104,7 @@ class TransactionJournalFactory | ||||
|     { | ||||
|         Log::debug('Now in TransactionJournalFactory::create()'); | ||||
|         // convert to special object.
 | ||||
|         $dataObject = new NullArrayObject($data); | ||||
|         $dataObject   = new NullArrayObject($data); | ||||
| 
 | ||||
|         Log::debug('Start of TransactionJournalFactory::create()'); | ||||
|         $collection   = new Collection(); | ||||
| @@ -163,18 +163,18 @@ class TransactionJournalFactory | ||||
|         $this->errorIfDuplicate($row['import_hash_v2']); | ||||
| 
 | ||||
|         // Some basic fields
 | ||||
|         $type   = $this->typeRepository->findTransactionType(null, $row['type']); | ||||
|         $carbon = $row['date'] ?? today(config('app.timezone')); | ||||
|         $order  = $row['order'] ?? 0; | ||||
|         $type                  = $this->typeRepository->findTransactionType(null, $row['type']); | ||||
|         $carbon                = $row['date'] ?? today(config('app.timezone')); | ||||
|         $order                 = $row['order'] ?? 0; | ||||
| 
 | ||||
|         Log::debug('Find currency or return default.'); | ||||
|         $currency = $this->currencyRepository->findCurrency((int) $row['currency_id'], $row['currency_code']); | ||||
|         $currency              = $this->currencyRepository->findCurrency((int) $row['currency_id'], $row['currency_code']); | ||||
|         Log::debug('Find foreign currency or return NULL.'); | ||||
| 
 | ||||
|         $foreignCurrency = $this->currencyRepository->findCurrencyNull($row['foreign_currency_id'], $row['foreign_currency_code']); | ||||
|         $bill            = $this->billRepository->findBill((int) $row['bill_id'], $row['bill_name']); | ||||
|         $billId          = TransactionTypeEnum::WITHDRAWAL->value === $type->type && null !== $bill ? $bill->id : null; | ||||
|         $description     = (string) $row['description']; | ||||
|         $foreignCurrency       = $this->currencyRepository->findCurrencyNull($row['foreign_currency_id'], $row['foreign_currency_code']); | ||||
|         $bill                  = $this->billRepository->findBill((int) $row['bill_id'], $row['bill_name']); | ||||
|         $billId                = TransactionTypeEnum::WITHDRAWAL->value === $type->type && null !== $bill ? $bill->id : null; | ||||
|         $description           = (string) $row['description']; | ||||
| 
 | ||||
|         // Manipulate basic fields
 | ||||
|         $carbon->setTimezone(config('app.timezone')); | ||||
| @@ -196,7 +196,7 @@ class TransactionJournalFactory | ||||
|         } | ||||
| 
 | ||||
|         /** create or get source and destination accounts  */ | ||||
|         $sourceInfo = [ | ||||
|         $sourceInfo            = [ | ||||
|             'id'          => $row['source_id'], | ||||
|             'name'        => $row['source_name'], | ||||
|             'iban'        => $row['source_iban'], | ||||
| @@ -205,7 +205,7 @@ class TransactionJournalFactory | ||||
|             'currency_id' => $currency->id, | ||||
|         ]; | ||||
| 
 | ||||
|         $destInfo = [ | ||||
|         $destInfo              = [ | ||||
|             'id'          => $row['destination_id'], | ||||
|             'name'        => $row['destination_name'], | ||||
|             'iban'        => $row['destination_iban'], | ||||
| @@ -215,8 +215,8 @@ class TransactionJournalFactory | ||||
|         ]; | ||||
|         Log::debug('Source info:', $sourceInfo); | ||||
|         Log::debug('Destination info:', $destInfo); | ||||
|         $sourceAccount      = $this->getAccount($type->type, 'source', $sourceInfo); | ||||
|         $destinationAccount = $this->getAccount($type->type, 'destination', $destInfo); | ||||
|         $sourceAccount         = $this->getAccount($type->type, 'source', $sourceInfo); | ||||
|         $destinationAccount    = $this->getAccount($type->type, 'destination', $destInfo); | ||||
|         Log::debug('Done with getAccount(2x)'); | ||||
| 
 | ||||
| 
 | ||||
| @@ -225,16 +225,16 @@ class TransactionJournalFactory | ||||
|             [$sourceAccount, $destinationAccount] = $this->reconciliationSanityCheck($sourceAccount, $destinationAccount); | ||||
|         } | ||||
| 
 | ||||
|         $currency        = $this->getCurrencyByAccount($type->type, $currency, $sourceAccount, $destinationAccount); | ||||
|         $foreignCurrency = $this->compareCurrencies($currency, $foreignCurrency); | ||||
|         $foreignCurrency = $this->getForeignByAccount($type->type, $foreignCurrency, $destinationAccount); | ||||
|         $description     = $this->getDescription($description); | ||||
|         $currency              = $this->getCurrencyByAccount($type->type, $currency, $sourceAccount, $destinationAccount); | ||||
|         $foreignCurrency       = $this->compareCurrencies($currency, $foreignCurrency); | ||||
|         $foreignCurrency       = $this->getForeignByAccount($type->type, $foreignCurrency, $destinationAccount); | ||||
|         $description           = $this->getDescription($description); | ||||
| 
 | ||||
|         Log::debug(sprintf('Currency is #%d "%s", foreign currency is #%d "%s"', $currency->id, $currency->code, $foreignCurrency?->id, $foreignCurrency)); | ||||
|         Log::debug(sprintf('Date: %s (%s)', $carbon->toW3cString(), $carbon->getTimezone()->getName())); | ||||
| 
 | ||||
|         /** Create a basic journal. */ | ||||
|         $journal = TransactionJournal::create( | ||||
|         $journal               = TransactionJournal::create( | ||||
|             [ | ||||
|                 'user_id'                 => $this->user->id, | ||||
|                 'user_group_id'           => $this->userGroup->id, | ||||
| @@ -252,7 +252,7 @@ class TransactionJournalFactory | ||||
|         Log::debug(sprintf('Created new journal #%d: "%s"', $journal->id, $journal->description)); | ||||
| 
 | ||||
|         /** Create two transactions. */ | ||||
|         $transactionFactory = app(TransactionFactory::class); | ||||
|         $transactionFactory    = app(TransactionFactory::class); | ||||
|         $transactionFactory->setJournal($journal); | ||||
|         $transactionFactory->setAccount($sourceAccount); | ||||
|         $transactionFactory->setCurrency($currency); | ||||
| @@ -270,7 +270,7 @@ class TransactionJournalFactory | ||||
|         } | ||||
| 
 | ||||
|         /** @var TransactionFactory $transactionFactory */ | ||||
|         $transactionFactory = app(TransactionFactory::class); | ||||
|         $transactionFactory    = app(TransactionFactory::class); | ||||
|         $transactionFactory->setJournal($journal); | ||||
|         $transactionFactory->setAccount($destinationAccount); | ||||
|         $transactionFactory->setAccountInformation($destInfo); | ||||
| @@ -282,10 +282,10 @@ class TransactionJournalFactory | ||||
|         // Firefly III will save the foreign currency information in such a way that both
 | ||||
|         // asset accounts can look at the "amount" and "transaction_currency_id" column and
 | ||||
|         // see the currency they expect to see.
 | ||||
|         $amount        = (string) $row['amount']; | ||||
|         $foreignAmount = (string) $row['foreign_amount']; | ||||
|         if (null !== $foreignCurrency && $foreignCurrency->id !== $currency->id && | ||||
|             (TransactionTypeEnum::TRANSFER->value === $type->type || $this->isBetweenAssetAndLiability($sourceAccount, $destinationAccount)) | ||||
|         $amount                = (string) $row['amount']; | ||||
|         $foreignAmount         = (string) $row['foreign_amount']; | ||||
|         if (null !== $foreignCurrency && $foreignCurrency->id !== $currency->id | ||||
|             && (TransactionTypeEnum::TRANSFER->value === $type->type || $this->isBetweenAssetAndLiability($sourceAccount, $destinationAccount)) | ||||
|         ) { | ||||
|             $transactionFactory->setCurrency($foreignCurrency); | ||||
|             $transactionFactory->setForeignCurrency($currency); | ||||
| @@ -303,7 +303,7 @@ class TransactionJournalFactory | ||||
| 
 | ||||
|             throw new FireflyException($e->getMessage(), 0, $e); | ||||
|         } | ||||
|         $journal->completed = true; | ||||
|         $journal->completed    = true; | ||||
|         $journal->save(); | ||||
|         $this->storeBudget($journal, $row); | ||||
|         $this->storeCategory($journal, $row); | ||||
| @@ -328,7 +328,7 @@ class TransactionJournalFactory | ||||
|             Log::error(sprintf('Could not encode dataRow: %s', $e->getMessage())); | ||||
|             $json = microtime(); | ||||
|         } | ||||
|         $hash = hash('sha256', $json); | ||||
|         $hash    = hash('sha256', $json); | ||||
|         Log::debug(sprintf('The hash is: %s', $hash), $dataRow); | ||||
| 
 | ||||
|         return $hash; | ||||
| @@ -349,12 +349,13 @@ class TransactionJournalFactory | ||||
| 
 | ||||
|         /** @var null|TransactionJournalMeta $result */ | ||||
|         $result = TransactionJournalMeta::withTrashed() | ||||
|                                         ->leftJoin('transaction_journals', 'transaction_journals.id', '=', 'journal_meta.transaction_journal_id') | ||||
|                                         ->whereNotNull('transaction_journals.id') | ||||
|                                         ->where('transaction_journals.user_id', $this->user->id) | ||||
|                                         ->where('data', \Safe\json_encode($hash, JSON_THROW_ON_ERROR)) | ||||
|                                         ->with(['transactionJournal', 'transactionJournal.transactionGroup']) | ||||
|                                         ->first(['journal_meta.*']); | ||||
|             ->leftJoin('transaction_journals', 'transaction_journals.id', '=', 'journal_meta.transaction_journal_id') | ||||
|             ->whereNotNull('transaction_journals.id') | ||||
|             ->where('transaction_journals.user_id', $this->user->id) | ||||
|             ->where('data', \Safe\json_encode($hash, JSON_THROW_ON_ERROR)) | ||||
|             ->with(['transactionJournal', 'transactionJournal.transactionGroup']) | ||||
|             ->first(['journal_meta.*']) | ||||
|         ; | ||||
|         if (null !== $result) { | ||||
|             Log::warning(sprintf('Found a duplicate in errorIfDuplicate because hash %s is not unique!', $hash)); | ||||
|             $journal = $result->transactionJournal()->withTrashed()->first(); | ||||
| @@ -371,18 +372,18 @@ class TransactionJournalFactory | ||||
|     private function validateAccounts(NullArrayObject $data): void | ||||
|     { | ||||
|         Log::debug(sprintf('Now in %s', __METHOD__)); | ||||
|         $transactionType = $data['type'] ?? 'invalid'; | ||||
|         $transactionType  = $data['type'] ?? 'invalid'; | ||||
|         $this->accountValidator->setUser($this->user); | ||||
|         $this->accountValidator->setTransactionType($transactionType); | ||||
| 
 | ||||
|         // validate source account.
 | ||||
|         $array       = [ | ||||
|         $array            = [ | ||||
|             'id'     => null !== $data['source_id'] ? (int) $data['source_id'] : null, | ||||
|             'name'   => null !== $data['source_name'] ? (string) $data['source_name'] : null, | ||||
|             'iban'   => null !== $data['source_iban'] ? (string) $data['source_iban'] : null, | ||||
|             'number' => null !== $data['source_number'] ? (string) $data['source_number'] : null, | ||||
|         ]; | ||||
|         $validSource = $this->accountValidator->validateSource($array); | ||||
|         $validSource      = $this->accountValidator->validateSource($array); | ||||
| 
 | ||||
|         // do something with result:
 | ||||
|         if (false === $validSource) { | ||||
| @@ -391,7 +392,7 @@ class TransactionJournalFactory | ||||
|         Log::debug('Source seems valid.'); | ||||
| 
 | ||||
|         // validate destination account
 | ||||
|         $array = [ | ||||
|         $array            = [ | ||||
|             'id'     => null !== $data['destination_id'] ? (int) $data['destination_id'] : null, | ||||
|             'name'   => null !== $data['destination_name'] ? (string) $data['destination_name'] : null, | ||||
|             'iban'   => null !== $data['destination_iban'] ? (string) $data['destination_iban'] : null, | ||||
| @@ -483,7 +484,7 @@ class TransactionJournalFactory | ||||
|             // return user's default:
 | ||||
|             return app('amount')->getNativeCurrencyByUserGroup($this->user->userGroup); | ||||
|         } | ||||
|         $result = $preference ?? $currency; | ||||
|         $result     = $preference ?? $currency; | ||||
|         Log::debug(sprintf('Currency is now #%d (%s) because of account #%d (%s)', $result->id, $result->code, $account->id, $account->name)); | ||||
| 
 | ||||
|         return $result; | ||||
| @@ -573,7 +574,7 @@ class TransactionJournalFactory | ||||
| 
 | ||||
|     protected function storeMeta(TransactionJournal $journal, NullArrayObject $data, string $field): void | ||||
|     { | ||||
|         $set = [ | ||||
|         $set     = [ | ||||
|             'journal' => $journal, | ||||
|             'name'    => $field, | ||||
|             'data'    => (string) ($data[$field] ?? ''), | ||||
| @@ -628,16 +629,19 @@ class TransactionJournalFactory | ||||
|         $sourceTypes = [AccountTypeEnum::LOAN->value, AccountTypeEnum::DEBT->value, AccountTypeEnum::MORTGAGE->value]; | ||||
| 
 | ||||
|         // source is liability, destination is asset
 | ||||
|         if(in_array($source->accountType->type, $sourceTypes, true) && AccountTypeEnum::ASSET->value === $destination->accountType->type) { | ||||
|         if (in_array($source->accountType->type, $sourceTypes, true) && AccountTypeEnum::ASSET->value === $destination->accountType->type) { | ||||
|             Log::debug('Source is a liability account, destination is an asset account, return TRUE.'); | ||||
| 
 | ||||
|             return true; | ||||
|         } | ||||
|         // source is asset, destination is liability
 | ||||
|         if(in_array($destination->accountType->type, $sourceTypes, true) && AccountTypeEnum::ASSET->value === $source->accountType->type) { | ||||
|         if (in_array($destination->accountType->type, $sourceTypes, true) && AccountTypeEnum::ASSET->value === $source->accountType->type) { | ||||
|             Log::debug('Destination is a liability account, source is an asset account, return TRUE.'); | ||||
| 
 | ||||
|             return true; | ||||
|         } | ||||
|         Log::debug('Not between asset and liability, return FALSE'); | ||||
| 
 | ||||
|         return false; | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -177,7 +177,7 @@ class Kernel extends HttpKernel | ||||
|             // full API authentication
 | ||||
|             'api'                   => [ | ||||
|                 AcceptHeaders::class, | ||||
| //                EnsureFrontendRequestsAreStateful::class,
 | ||||
|                 //                EnsureFrontendRequestsAreStateful::class,
 | ||||
|                 'auth:api,sanctum', | ||||
|                 'bindings', | ||||
|             ], | ||||
|   | ||||
| @@ -50,15 +50,15 @@ class ReturnsAvailableChannels | ||||
|     private static function returnOwnerChannels(): array | ||||
|     { | ||||
| 
 | ||||
|         $channels          = ['mail']; | ||||
|         if(true === config('notifications.channels.slack.enabled', false)) { | ||||
|         $channels = ['mail']; | ||||
|         if (true === config('notifications.channels.slack.enabled', false)) { | ||||
|             $slackUrl = app('fireflyconfig')->getEncrypted('slack_webhook_url', '')->data; | ||||
|             if (UrlValidator::isValidWebhookURL($slackUrl)) { | ||||
|                 $channels[] = 'slack'; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         if(true === config('notifications.channels.ntfy.enabled', false)) { | ||||
|         if (true === config('notifications.channels.ntfy.enabled', false)) { | ||||
|             // validate presence of of Ntfy settings.
 | ||||
|             if ('' !== (string) app('fireflyconfig')->getEncrypted('ntfy_topic', '')->data) { | ||||
|                 Log::debug('Enabled ntfy.'); | ||||
| @@ -70,7 +70,7 @@ class ReturnsAvailableChannels | ||||
|         } | ||||
| 
 | ||||
|         // pushover
 | ||||
|         if(true === config('notifications.channels.pushover.enabled', false)) { | ||||
|         if (true === config('notifications.channels.pushover.enabled', false)) { | ||||
|             $pushoverAppToken  = (string) app('fireflyconfig')->getEncrypted('pushover_app_token', '')->data; | ||||
|             $pushoverUserToken = (string) app('fireflyconfig')->getEncrypted('pushover_user_token', '')->data; | ||||
|             if ('' === $pushoverAppToken || '' === $pushoverUserToken) { | ||||
| @@ -90,9 +90,9 @@ class ReturnsAvailableChannels | ||||
|     private static function returnUserChannels(User $user): array | ||||
|     { | ||||
|         Log::debug(sprintf('Checking channels for user #%d', $user->id)); | ||||
|         $channels          = ['mail']; | ||||
|         $channels = ['mail']; | ||||
| 
 | ||||
|         if(true === config('notifications.channels.slack.enabled', false)) { | ||||
|         if (true === config('notifications.channels.slack.enabled', false)) { | ||||
|             $slackUrl = (string) app('preferences')->getEncryptedForUser($user, 'slack_webhook_url', '')->data; | ||||
|             if (UrlValidator::isValidWebhookURL($slackUrl)) { | ||||
|                 $channels[] = 'slack'; | ||||
| @@ -100,7 +100,7 @@ class ReturnsAvailableChannels | ||||
|         } | ||||
| 
 | ||||
|         // validate presence of of Ntfy settings.
 | ||||
|         if(true === config('notifications.channels.nfy.enabled', false)) { | ||||
|         if (true === config('notifications.channels.nfy.enabled', false)) { | ||||
|             $ntfyTopic = (string) app('preferences')->getEncryptedForUser($user, 'ntfy_topic', '')->data; | ||||
|             if ('' !== $ntfyTopic) { | ||||
|                 Log::debug(sprintf('Enabled ntfy, "%s"', $ntfyTopic)); | ||||
| @@ -112,7 +112,7 @@ class ReturnsAvailableChannels | ||||
|         } | ||||
| 
 | ||||
|         // pushover
 | ||||
|         if(true === config('notifications.channels.slack.enabled', false)) { | ||||
|         if (true === config('notifications.channels.slack.enabled', false)) { | ||||
|             $pushoverAppToken  = (string) app('preferences')->getEncryptedForUser($user, 'pushover_app_token', '')->data; | ||||
|             $pushoverUserToken = (string) app('preferences')->getEncryptedForUser($user, 'pushover_user_token', '')->data; | ||||
|             if ('' === $pushoverAppToken || '' === $pushoverUserToken) { | ||||
|   | ||||
| @@ -79,7 +79,7 @@ class AccountEnrichment implements EnrichmentInterface | ||||
|     } | ||||
| 
 | ||||
|     #[\Override]
 | ||||
|     public function enrichSingle(array | Model $model): Account | array | ||||
|     public function enrichSingle(array|Model $model): Account|array | ||||
|     { | ||||
|         Log::debug(__METHOD__); | ||||
|         $collection = new Collection([$model]); | ||||
| @@ -133,9 +133,10 @@ class AccountEnrichment implements EnrichmentInterface | ||||
| 
 | ||||
|     private function collectMetaData(): void | ||||
|     { | ||||
|         $set = AccountMeta::whereIn('name', ['is_multi_currency', 'include_net_worth', 'currency_id', 'account_role', 'account_number', 'BIC', 'liability_direction', 'interest', 'interest_period', 'current_debt']) | ||||
|                           ->whereIn('account_id', $this->accountIds) | ||||
|                           ->get(['account_meta.id', 'account_meta.account_id', 'account_meta.name', 'account_meta.data'])->toArray(); | ||||
|         $set                 = AccountMeta::whereIn('name', ['is_multi_currency', 'include_net_worth', 'currency_id', 'account_role', 'account_number', 'BIC', 'liability_direction', 'interest', 'interest_period', 'current_debt']) | ||||
|             ->whereIn('account_id', $this->accountIds) | ||||
|             ->get(['account_meta.id', 'account_meta.account_id', 'account_meta.name', 'account_meta.data'])->toArray() | ||||
|         ; | ||||
| 
 | ||||
|         /** @var array $entry */ | ||||
|         foreach ($set as $entry) { | ||||
| @@ -144,7 +145,7 @@ class AccountEnrichment implements EnrichmentInterface | ||||
|                 $this->currencies[(int) $entry['data']] = true; | ||||
|             } | ||||
|         } | ||||
|         $currencies = TransactionCurrency::whereIn('id', array_keys($this->currencies))->get(); | ||||
|         $currencies          = TransactionCurrency::whereIn('id', array_keys($this->currencies))->get(); | ||||
|         foreach ($currencies as $currency) { | ||||
|             $this->currencies[(int) $currency->id] = $currency; | ||||
|         } | ||||
| @@ -159,9 +160,10 @@ class AccountEnrichment implements EnrichmentInterface | ||||
|     private function collectNotes(): void | ||||
|     { | ||||
|         $notes = Note::query()->whereIn('noteable_id', $this->accountIds) | ||||
|                      ->whereNotNull('notes.text') | ||||
|                      ->where('notes.text', '!=', '') | ||||
|                      ->where('noteable_type', Account::class)->get(['notes.noteable_id', 'notes.text'])->toArray(); | ||||
|             ->whereNotNull('notes.text') | ||||
|             ->where('notes.text', '!=', '') | ||||
|             ->where('noteable_type', Account::class)->get(['notes.noteable_id', 'notes.text'])->toArray() | ||||
|         ; | ||||
|         foreach ($notes as $note) { | ||||
|             $this->notes[(int) $note['noteable_id']] = (string) $note['text']; | ||||
|         } | ||||
| @@ -171,14 +173,15 @@ class AccountEnrichment implements EnrichmentInterface | ||||
|     private function collectLocations(): void | ||||
|     { | ||||
|         $locations = Location::query()->whereIn('locatable_id', $this->accountIds) | ||||
|                              ->where('locatable_type', Account::class)->get(['locations.locatable_id', 'locations.latitude', 'locations.longitude', 'locations.zoom_level'])->toArray(); | ||||
|             ->where('locatable_type', Account::class)->get(['locations.locatable_id', 'locations.latitude', 'locations.longitude', 'locations.zoom_level'])->toArray() | ||||
|         ; | ||||
|         foreach ($locations as $location) { | ||||
|             $this->locations[(int) $location['locatable_id']] | ||||
|                 = [ | ||||
|                 'latitude'   => (float) $location['latitude'], | ||||
|                 'longitude'  => (float) $location['longitude'], | ||||
|                 'zoom_level' => (int) $location['zoom_level'], | ||||
|             ]; | ||||
|                     'latitude'   => (float) $location['latitude'], | ||||
|                     'longitude'  => (float) $location['longitude'], | ||||
|                     'zoom_level' => (int) $location['zoom_level'], | ||||
|                 ]; | ||||
|         } | ||||
|         Log::debug(sprintf('Enrich with %d locations(s)', count($this->locations))); | ||||
|     } | ||||
| @@ -193,19 +196,20 @@ class AccountEnrichment implements EnrichmentInterface | ||||
|             ->setUserGroup($this->userGroup) | ||||
|             ->setAccounts($this->collection) | ||||
|             ->withAccountInformation() | ||||
|             ->setTypes([TransactionTypeEnum::OPENING_BALANCE->value]); | ||||
|         $journals = $collector->getExtractedJournals(); | ||||
|             ->setTypes([TransactionTypeEnum::OPENING_BALANCE->value]) | ||||
|         ; | ||||
|         $journals  = $collector->getExtractedJournals(); | ||||
|         foreach ($journals as $journal) { | ||||
|             $this->openingBalances[(int) $journal['source_account_id']] | ||||
|                 = [ | ||||
|                 'amount' => Steam::negative($journal['amount']), | ||||
|                 'date'   => $journal['date'], | ||||
|             ]; | ||||
|                     'amount' => Steam::negative($journal['amount']), | ||||
|                     'date'   => $journal['date'], | ||||
|                 ]; | ||||
|             $this->openingBalances[(int) $journal['destination_account_id']] | ||||
|                 = [ | ||||
|                 'amount' => Steam::positive($journal['amount']), | ||||
|                 'date'   => $journal['date'], | ||||
|             ]; | ||||
|                     'amount' => Steam::positive($journal['amount']), | ||||
|                     'date'   => $journal['date'], | ||||
|                 ]; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| @@ -228,7 +232,7 @@ class AccountEnrichment implements EnrichmentInterface | ||||
|         $notes            = $this->notes; | ||||
|         $openingBalances  = $this->openingBalances; | ||||
|         $locations        = $this->locations; | ||||
|         $lastActivities = $this->lastActivities; | ||||
|         $lastActivities   = $this->lastActivities; | ||||
|         $this->collection = $this->collection->map(function (Account $item) use ($accountTypes, $meta, $currencies, $notes, $openingBalances, $locations, $lastActivities) { | ||||
|             $item->full_account_type = $accountTypes[(int) $item->account_type_id] ?? null; | ||||
|             $accountMeta             = [ | ||||
| @@ -267,7 +271,7 @@ class AccountEnrichment implements EnrichmentInterface | ||||
|             if (array_key_exists($item->id, $lastActivities)) { | ||||
|                 $accountMeta['last_activity'] = $lastActivities[$item->id]; | ||||
|             } | ||||
|             $item->meta = $accountMeta; | ||||
|             $item->meta              = $accountMeta; | ||||
| 
 | ||||
|             return $item; | ||||
|         }); | ||||
|   | ||||
| @@ -152,7 +152,7 @@ class AccountTransformer extends AbstractTransformer | ||||
|             'longitude'                      => $longitude, | ||||
|             'latitude'                       => $latitude, | ||||
|             'zoom_level'                     => $zoomLevel, | ||||
|             'last_activity' => array_key_exists('last_activity', $account->meta) ? $account->meta['last_activity']->toAtomString() : null, | ||||
|             'last_activity'                  => array_key_exists('last_activity', $account->meta) ? $account->meta['last_activity']->toAtomString() : null, | ||||
|             'links'                          => [ | ||||
|                 [ | ||||
|                     'rel' => 'self', | ||||
|   | ||||
| @@ -234,7 +234,7 @@ trait TransactionValidation | ||||
|             return; | ||||
|         } | ||||
|         Log::debug(sprintf('Source account expects #%d: %s', $sourceCurrency->id, $sourceCurrency->code)); | ||||
|         Log::debug(sprintf('Destination account expects #%d: %s', $destinationCurrency->id,  $destinationCurrency->code)); | ||||
|         Log::debug(sprintf('Destination account expects #%d: %s', $destinationCurrency->id, $destinationCurrency->code)); | ||||
| 
 | ||||
|         Log::debug(sprintf('Amount is %s', $transaction['amount'])); | ||||
| 
 | ||||
|   | ||||
							
								
								
									
										88
									
								
								composer.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										88
									
								
								composer.lock
									
									
									
										generated
									
									
									
								
							| @@ -1879,16 +1879,16 @@ | ||||
|         }, | ||||
|         { | ||||
|             "name": "laravel/framework", | ||||
|             "version": "v12.12.0", | ||||
|             "version": "v12.13.0", | ||||
|             "source": { | ||||
|                 "type": "git", | ||||
|                 "url": "https://github.com/laravel/framework.git", | ||||
|                 "reference": "8f6cd73696068c28f30f5964556ec9d14e5d90d7" | ||||
|                 "reference": "52b588bcd8efc6d01bc1493d2d67848f8065f269" | ||||
|             }, | ||||
|             "dist": { | ||||
|                 "type": "zip", | ||||
|                 "url": "https://api.github.com/repos/laravel/framework/zipball/8f6cd73696068c28f30f5964556ec9d14e5d90d7", | ||||
|                 "reference": "8f6cd73696068c28f30f5964556ec9d14e5d90d7", | ||||
|                 "url": "https://api.github.com/repos/laravel/framework/zipball/52b588bcd8efc6d01bc1493d2d67848f8065f269", | ||||
|                 "reference": "52b588bcd8efc6d01bc1493d2d67848f8065f269", | ||||
|                 "shasum": "" | ||||
|             }, | ||||
|             "require": { | ||||
| @@ -1909,7 +1909,7 @@ | ||||
|                 "guzzlehttp/uri-template": "^1.0", | ||||
|                 "laravel/prompts": "^0.3.0", | ||||
|                 "laravel/serializable-closure": "^1.3|^2.0", | ||||
|                 "league/commonmark": "^2.6", | ||||
|                 "league/commonmark": "^2.7", | ||||
|                 "league/flysystem": "^3.25.1", | ||||
|                 "league/flysystem-local": "^3.25.1", | ||||
|                 "league/uri": "^7.5.1", | ||||
| @@ -2001,7 +2001,7 @@ | ||||
|                 "php-http/discovery": "^1.15", | ||||
|                 "phpstan/phpstan": "^2.0", | ||||
|                 "phpunit/phpunit": "^10.5.35|^11.5.3|^12.0.1", | ||||
|                 "predis/predis": "^2.3", | ||||
|                 "predis/predis": "^2.3|^3.0", | ||||
|                 "resend/resend-php": "^0.10.0", | ||||
|                 "symfony/cache": "^7.2.0", | ||||
|                 "symfony/http-client": "^7.2.0", | ||||
| @@ -2033,7 +2033,7 @@ | ||||
|                 "pda/pheanstalk": "Required to use the beanstalk queue driver (^5.0).", | ||||
|                 "php-http/discovery": "Required to use PSR-7 bridging features (^1.15).", | ||||
|                 "phpunit/phpunit": "Required to use assertions and run tests (^10.5.35|^11.5.3|^12.0.1).", | ||||
|                 "predis/predis": "Required to use the predis connector (^2.3).", | ||||
|                 "predis/predis": "Required to use the predis connector (^2.3|^3.0).", | ||||
|                 "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).", | ||||
|                 "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^6.0|^7.0).", | ||||
|                 "resend/resend-php": "Required to enable support for the Resend mail transport (^0.10.0).", | ||||
| @@ -2090,7 +2090,7 @@ | ||||
|                 "issues": "https://github.com/laravel/framework/issues", | ||||
|                 "source": "https://github.com/laravel/framework" | ||||
|             }, | ||||
|             "time": "2025-05-01T16:13:12+00:00" | ||||
|             "time": "2025-05-07T17:29:01+00:00" | ||||
|         }, | ||||
|         { | ||||
|             "name": "laravel/passport", | ||||
| @@ -4001,31 +4001,31 @@ | ||||
|         }, | ||||
|         { | ||||
|             "name": "nunomaduro/termwind", | ||||
|             "version": "v2.3.0", | ||||
|             "version": "v2.3.1", | ||||
|             "source": { | ||||
|                 "type": "git", | ||||
|                 "url": "https://github.com/nunomaduro/termwind.git", | ||||
|                 "reference": "52915afe6a1044e8b9cee1bcff836fb63acf9cda" | ||||
|                 "reference": "dfa08f390e509967a15c22493dc0bac5733d9123" | ||||
|             }, | ||||
|             "dist": { | ||||
|                 "type": "zip", | ||||
|                 "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/52915afe6a1044e8b9cee1bcff836fb63acf9cda", | ||||
|                 "reference": "52915afe6a1044e8b9cee1bcff836fb63acf9cda", | ||||
|                 "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/dfa08f390e509967a15c22493dc0bac5733d9123", | ||||
|                 "reference": "dfa08f390e509967a15c22493dc0bac5733d9123", | ||||
|                 "shasum": "" | ||||
|             }, | ||||
|             "require": { | ||||
|                 "ext-mbstring": "*", | ||||
|                 "php": "^8.2", | ||||
|                 "symfony/console": "^7.1.8" | ||||
|                 "symfony/console": "^7.2.6" | ||||
|             }, | ||||
|             "require-dev": { | ||||
|                 "illuminate/console": "^11.33.2", | ||||
|                 "laravel/pint": "^1.18.2", | ||||
|                 "illuminate/console": "^11.44.7", | ||||
|                 "laravel/pint": "^1.22.0", | ||||
|                 "mockery/mockery": "^1.6.12", | ||||
|                 "pestphp/pest": "^2.36.0", | ||||
|                 "phpstan/phpstan": "^1.12.11", | ||||
|                 "phpstan/phpstan-strict-rules": "^1.6.1", | ||||
|                 "symfony/var-dumper": "^7.1.8", | ||||
|                 "pestphp/pest": "^2.36.0 || ^3.8.2", | ||||
|                 "phpstan/phpstan": "^1.12.25", | ||||
|                 "phpstan/phpstan-strict-rules": "^1.6.2", | ||||
|                 "symfony/var-dumper": "^7.2.6", | ||||
|                 "thecodingmachine/phpstan-strict-rules": "^1.0.0" | ||||
|             }, | ||||
|             "type": "library", | ||||
| @@ -4068,7 +4068,7 @@ | ||||
|             ], | ||||
|             "support": { | ||||
|                 "issues": "https://github.com/nunomaduro/termwind/issues", | ||||
|                 "source": "https://github.com/nunomaduro/termwind/tree/v2.3.0" | ||||
|                 "source": "https://github.com/nunomaduro/termwind/tree/v2.3.1" | ||||
|             }, | ||||
|             "funding": [ | ||||
|                 { | ||||
| @@ -4084,7 +4084,7 @@ | ||||
|                     "type": "github" | ||||
|                 } | ||||
|             ], | ||||
|             "time": "2024-11-21T10:39:51+00:00" | ||||
|             "time": "2025-05-08T08:14:37+00:00" | ||||
|         }, | ||||
|         { | ||||
|             "name": "nyholm/psr7", | ||||
| @@ -5847,16 +5847,16 @@ | ||||
|         }, | ||||
|         { | ||||
|             "name": "spatie/backtrace", | ||||
|             "version": "1.7.2", | ||||
|             "version": "1.7.4", | ||||
|             "source": { | ||||
|                 "type": "git", | ||||
|                 "url": "https://github.com/spatie/backtrace.git", | ||||
|                 "reference": "9807de6b8fecfaa5b3d10650985f0348b02862b2" | ||||
|                 "reference": "cd37a49fce7137359ac30ecc44ef3e16404cccbe" | ||||
|             }, | ||||
|             "dist": { | ||||
|                 "type": "zip", | ||||
|                 "url": "https://api.github.com/repos/spatie/backtrace/zipball/9807de6b8fecfaa5b3d10650985f0348b02862b2", | ||||
|                 "reference": "9807de6b8fecfaa5b3d10650985f0348b02862b2", | ||||
|                 "url": "https://api.github.com/repos/spatie/backtrace/zipball/cd37a49fce7137359ac30ecc44ef3e16404cccbe", | ||||
|                 "reference": "cd37a49fce7137359ac30ecc44ef3e16404cccbe", | ||||
|                 "shasum": "" | ||||
|             }, | ||||
|             "require": { | ||||
| @@ -5894,7 +5894,7 @@ | ||||
|                 "spatie" | ||||
|             ], | ||||
|             "support": { | ||||
|                 "source": "https://github.com/spatie/backtrace/tree/1.7.2" | ||||
|                 "source": "https://github.com/spatie/backtrace/tree/1.7.4" | ||||
|             }, | ||||
|             "funding": [ | ||||
|                 { | ||||
| @@ -5906,7 +5906,7 @@ | ||||
|                     "type": "other" | ||||
|                 } | ||||
|             ], | ||||
|             "time": "2025-04-28T14:55:53+00:00" | ||||
|             "time": "2025-05-08T15:41:09+00:00" | ||||
|         }, | ||||
|         { | ||||
|             "name": "spatie/error-solutions", | ||||
| @@ -11320,16 +11320,16 @@ | ||||
|         }, | ||||
|         { | ||||
|             "name": "phpunit/phpunit", | ||||
|             "version": "12.1.4", | ||||
|             "version": "12.1.5", | ||||
|             "source": { | ||||
|                 "type": "git", | ||||
|                 "url": "https://github.com/sebastianbergmann/phpunit.git", | ||||
|                 "reference": "5ee57ad690bda2c487594577600931a99053436c" | ||||
|                 "reference": "f93ef2198df8d54b3195bcee381a33be51d8705e" | ||||
|             }, | ||||
|             "dist": { | ||||
|                 "type": "zip", | ||||
|                 "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/5ee57ad690bda2c487594577600931a99053436c", | ||||
|                 "reference": "5ee57ad690bda2c487594577600931a99053436c", | ||||
|                 "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/f93ef2198df8d54b3195bcee381a33be51d8705e", | ||||
|                 "reference": "f93ef2198df8d54b3195bcee381a33be51d8705e", | ||||
|                 "shasum": "" | ||||
|             }, | ||||
|             "require": { | ||||
| @@ -11343,7 +11343,7 @@ | ||||
|                 "phar-io/manifest": "^2.0.4", | ||||
|                 "phar-io/version": "^3.2.1", | ||||
|                 "php": ">=8.3", | ||||
|                 "phpunit/php-code-coverage": "^12.1.2", | ||||
|                 "phpunit/php-code-coverage": "^12.2.1", | ||||
|                 "phpunit/php-file-iterator": "^6.0.0", | ||||
|                 "phpunit/php-invoker": "^6.0.0", | ||||
|                 "phpunit/php-text-template": "^5.0.0", | ||||
| @@ -11397,7 +11397,7 @@ | ||||
|             "support": { | ||||
|                 "issues": "https://github.com/sebastianbergmann/phpunit/issues", | ||||
|                 "security": "https://github.com/sebastianbergmann/phpunit/security/policy", | ||||
|                 "source": "https://github.com/sebastianbergmann/phpunit/tree/12.1.4" | ||||
|                 "source": "https://github.com/sebastianbergmann/phpunit/tree/12.1.5" | ||||
|             }, | ||||
|             "funding": [ | ||||
|                 { | ||||
| @@ -11421,25 +11421,25 @@ | ||||
|                     "type": "tidelift" | ||||
|                 } | ||||
|             ], | ||||
|             "time": "2025-05-02T07:01:56+00:00" | ||||
|             "time": "2025-05-11T06:44:52+00:00" | ||||
|         }, | ||||
|         { | ||||
|             "name": "rector/rector", | ||||
|             "version": "2.0.14", | ||||
|             "version": "2.0.15", | ||||
|             "source": { | ||||
|                 "type": "git", | ||||
|                 "url": "https://github.com/rectorphp/rector.git", | ||||
|                 "reference": "63923bc9383c1212476c41d8cebf58a425e6f98d" | ||||
|                 "reference": "abbbf32474a67e242d26bffc098a712a05b3d32a" | ||||
|             }, | ||||
|             "dist": { | ||||
|                 "type": "zip", | ||||
|                 "url": "https://api.github.com/repos/rectorphp/rector/zipball/63923bc9383c1212476c41d8cebf58a425e6f98d", | ||||
|                 "reference": "63923bc9383c1212476c41d8cebf58a425e6f98d", | ||||
|                 "url": "https://api.github.com/repos/rectorphp/rector/zipball/abbbf32474a67e242d26bffc098a712a05b3d32a", | ||||
|                 "reference": "abbbf32474a67e242d26bffc098a712a05b3d32a", | ||||
|                 "shasum": "" | ||||
|             }, | ||||
|             "require": { | ||||
|                 "php": "^7.4|^8.0", | ||||
|                 "phpstan/phpstan": "^2.1.12" | ||||
|                 "phpstan/phpstan": "^2.1.14" | ||||
|             }, | ||||
|             "conflict": { | ||||
|                 "rector/rector-doctrine": "*", | ||||
| @@ -11472,7 +11472,7 @@ | ||||
|             ], | ||||
|             "support": { | ||||
|                 "issues": "https://github.com/rectorphp/rector/issues", | ||||
|                 "source": "https://github.com/rectorphp/rector/tree/2.0.14" | ||||
|                 "source": "https://github.com/rectorphp/rector/tree/2.0.15" | ||||
|             }, | ||||
|             "funding": [ | ||||
|                 { | ||||
| @@ -11480,7 +11480,7 @@ | ||||
|                     "type": "github" | ||||
|                 } | ||||
|             ], | ||||
|             "time": "2025-04-28T00:03:14+00:00" | ||||
|             "time": "2025-05-05T10:00:41+00:00" | ||||
|         }, | ||||
|         { | ||||
|             "name": "sebastian/cli-parser", | ||||
| @@ -12597,7 +12597,7 @@ | ||||
|     ], | ||||
|     "aliases": [], | ||||
|     "minimum-stability": "stable", | ||||
|     "stability-flags": [], | ||||
|     "stability-flags": {}, | ||||
|     "prefer-stable": false, | ||||
|     "prefer-lowest": false, | ||||
|     "platform": { | ||||
| @@ -12618,6 +12618,6 @@ | ||||
|         "ext-xml": "*", | ||||
|         "ext-xmlwriter": "*" | ||||
|     }, | ||||
|     "platform-dev": [], | ||||
|     "plugin-api-version": "2.3.0" | ||||
|     "platform-dev": {}, | ||||
|     "plugin-api-version": "2.6.0" | ||||
| } | ||||
|   | ||||
| @@ -78,7 +78,7 @@ return [ | ||||
|         'running_balance_column' => env('USE_RUNNING_BALANCE', false), | ||||
|         // see cer.php for exchange rates feature flag.
 | ||||
|     ], | ||||
|     'version'                      => 'develop/2025-05-05', | ||||
|     'version'                      => 'develop/2025-05-11', | ||||
|     'api_version'                  => '2.1.0', // field is no longer used.
 | ||||
|     'db_version'                   => 25, | ||||
| 
 | ||||
|   | ||||
							
								
								
									
										469
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										469
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							| @@ -43,9 +43,9 @@ | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/@babel/compat-data": { | ||||
|             "version": "7.27.1", | ||||
|             "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.1.tgz", | ||||
|             "integrity": "sha512-Q+E+rd/yBzNQhXkG+zQnF58e4zoZfBedaxwzPmicKsiK3nt8iJYrSrDbjwFFDGC4f+rPafqRaPH6TsDoSvMf7A==", | ||||
|             "version": "7.27.2", | ||||
|             "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.2.tgz", | ||||
|             "integrity": "sha512-TUtMJYRPyUb/9aU8f3K0mjmjf6M9N5Woshn2CS6nqJSeJtTtQcpLUXjGt9vbF8ZGff0El99sWkLgzwW3VXnxZQ==", | ||||
|             "dev": true, | ||||
|             "license": "MIT", | ||||
|             "engines": { | ||||
| @@ -124,13 +124,13 @@ | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/@babel/helper-compilation-targets": { | ||||
|             "version": "7.27.1", | ||||
|             "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.1.tgz", | ||||
|             "integrity": "sha512-2YaDd/Rd9E598B5+WIc8wJPmWETiiJXFYVE60oX8FDohv7rAUU3CQj+A1MgeEmcsk2+dQuEjIe/GDvig0SqL4g==", | ||||
|             "version": "7.27.2", | ||||
|             "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", | ||||
|             "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", | ||||
|             "dev": true, | ||||
|             "license": "MIT", | ||||
|             "dependencies": { | ||||
|                 "@babel/compat-data": "^7.27.1", | ||||
|                 "@babel/compat-data": "^7.27.2", | ||||
|                 "@babel/helper-validator-option": "^7.27.1", | ||||
|                 "browserslist": "^4.24.0", | ||||
|                 "lru-cache": "^5.1.1", | ||||
| @@ -406,9 +406,9 @@ | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/@babel/parser": { | ||||
|             "version": "7.27.1", | ||||
|             "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.1.tgz", | ||||
|             "integrity": "sha512-I0dZ3ZpCrJ1c04OqlNsQcKiZlsrXf/kkE4FXzID9rIOYICsAbA8mMDzhW/luRNAHdCNt7os/u8wenklZDlUVUQ==", | ||||
|             "version": "7.27.2", | ||||
|             "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.2.tgz", | ||||
|             "integrity": "sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==", | ||||
|             "dev": true, | ||||
|             "license": "MIT", | ||||
|             "dependencies": { | ||||
| @@ -1119,14 +1119,15 @@ | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/@babel/plugin-transform-object-rest-spread": { | ||||
|             "version": "7.27.1", | ||||
|             "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.27.1.tgz", | ||||
|             "integrity": "sha512-/sSliVc9gHE20/7D5qsdGlq7RG5NCDTWsAhyqzGuq174EtWJoGzIu1BQ7G56eDsTcy1jseBZwv50olSdXOlGuA==", | ||||
|             "version": "7.27.2", | ||||
|             "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.27.2.tgz", | ||||
|             "integrity": "sha512-AIUHD7xJ1mCrj3uPozvtngY3s0xpv7Nu7DoUSnzNY6Xam1Cy4rUznR//pvMHOhQ4AvbCexhbqXCtpxGHOGOO6g==", | ||||
|             "dev": true, | ||||
|             "license": "MIT", | ||||
|             "dependencies": { | ||||
|                 "@babel/helper-compilation-targets": "^7.27.1", | ||||
|                 "@babel/helper-compilation-targets": "^7.27.2", | ||||
|                 "@babel/helper-plugin-utils": "^7.27.1", | ||||
|                 "@babel/plugin-transform-destructuring": "^7.27.1", | ||||
|                 "@babel/plugin-transform-parameters": "^7.27.1" | ||||
|             }, | ||||
|             "engines": { | ||||
| @@ -1482,14 +1483,14 @@ | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/@babel/preset-env": { | ||||
|             "version": "7.27.1", | ||||
|             "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.27.1.tgz", | ||||
|             "integrity": "sha512-TZ5USxFpLgKDpdEt8YWBR7p6g+bZo6sHaXLqP2BY/U0acaoI8FTVflcYCr/v94twM1C5IWFdZ/hscq9WjUeLXA==", | ||||
|             "version": "7.27.2", | ||||
|             "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.27.2.tgz", | ||||
|             "integrity": "sha512-Ma4zSuYSlGNRlCLO+EAzLnCmJK2vdstgv+n7aUP+/IKZrOfWHOJVdSJtuub8RzHTj3ahD37k5OKJWvzf16TQyQ==", | ||||
|             "dev": true, | ||||
|             "license": "MIT", | ||||
|             "dependencies": { | ||||
|                 "@babel/compat-data": "^7.27.1", | ||||
|                 "@babel/helper-compilation-targets": "^7.27.1", | ||||
|                 "@babel/compat-data": "^7.27.2", | ||||
|                 "@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", | ||||
| @@ -1531,7 +1532,7 @@ | ||||
|                 "@babel/plugin-transform-new-target": "^7.27.1", | ||||
|                 "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", | ||||
|                 "@babel/plugin-transform-numeric-separator": "^7.27.1", | ||||
|                 "@babel/plugin-transform-object-rest-spread": "^7.27.1", | ||||
|                 "@babel/plugin-transform-object-rest-spread": "^7.27.2", | ||||
|                 "@babel/plugin-transform-object-super": "^7.27.1", | ||||
|                 "@babel/plugin-transform-optional-catch-binding": "^7.27.1", | ||||
|                 "@babel/plugin-transform-optional-chaining": "^7.27.1", | ||||
| @@ -1600,14 +1601,14 @@ | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/@babel/template": { | ||||
|             "version": "7.27.1", | ||||
|             "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.1.tgz", | ||||
|             "integrity": "sha512-Fyo3ghWMqkHHpHQCoBs2VnYjR4iWFFjguTDEqA5WgZDOrFesVjMhMM2FSqTKSoUSDO1VQtavj8NFpdRBEvJTtg==", | ||||
|             "version": "7.27.2", | ||||
|             "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", | ||||
|             "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", | ||||
|             "dev": true, | ||||
|             "license": "MIT", | ||||
|             "dependencies": { | ||||
|                 "@babel/code-frame": "^7.27.1", | ||||
|                 "@babel/parser": "^7.27.1", | ||||
|                 "@babel/parser": "^7.27.2", | ||||
|                 "@babel/types": "^7.27.1" | ||||
|             }, | ||||
|             "engines": { | ||||
| @@ -1669,9 +1670,9 @@ | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/@esbuild/aix-ppc64": { | ||||
|             "version": "0.25.3", | ||||
|             "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.3.tgz", | ||||
|             "integrity": "sha512-W8bFfPA8DowP8l//sxjJLSLkD8iEjMc7cBVyP+u4cEv9sM7mdUCkgsj+t0n/BWPFtv7WWCN5Yzj0N6FJNUUqBQ==", | ||||
|             "version": "0.25.4", | ||||
|             "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.4.tgz", | ||||
|             "integrity": "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==", | ||||
|             "cpu": [ | ||||
|                 "ppc64" | ||||
|             ], | ||||
| @@ -1686,9 +1687,9 @@ | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/@esbuild/android-arm": { | ||||
|             "version": "0.25.3", | ||||
|             "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.3.tgz", | ||||
|             "integrity": "sha512-PuwVXbnP87Tcff5I9ngV0lmiSu40xw1At6i3GsU77U7cjDDB4s0X2cyFuBiDa1SBk9DnvWwnGvVaGBqoFWPb7A==", | ||||
|             "version": "0.25.4", | ||||
|             "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.4.tgz", | ||||
|             "integrity": "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==", | ||||
|             "cpu": [ | ||||
|                 "arm" | ||||
|             ], | ||||
| @@ -1703,9 +1704,9 @@ | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/@esbuild/android-arm64": { | ||||
|             "version": "0.25.3", | ||||
|             "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.3.tgz", | ||||
|             "integrity": "sha512-XelR6MzjlZuBM4f5z2IQHK6LkK34Cvv6Rj2EntER3lwCBFdg6h2lKbtRjpTTsdEjD/WSe1q8UyPBXP1x3i/wYQ==", | ||||
|             "version": "0.25.4", | ||||
|             "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.4.tgz", | ||||
|             "integrity": "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==", | ||||
|             "cpu": [ | ||||
|                 "arm64" | ||||
|             ], | ||||
| @@ -1720,9 +1721,9 @@ | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/@esbuild/android-x64": { | ||||
|             "version": "0.25.3", | ||||
|             "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.3.tgz", | ||||
|             "integrity": "sha512-ogtTpYHT/g1GWS/zKM0cc/tIebFjm1F9Aw1boQ2Y0eUQ+J89d0jFY//s9ei9jVIlkYi8AfOjiixcLJSGNSOAdQ==", | ||||
|             "version": "0.25.4", | ||||
|             "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.4.tgz", | ||||
|             "integrity": "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==", | ||||
|             "cpu": [ | ||||
|                 "x64" | ||||
|             ], | ||||
| @@ -1737,9 +1738,9 @@ | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/@esbuild/darwin-arm64": { | ||||
|             "version": "0.25.3", | ||||
|             "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.3.tgz", | ||||
|             "integrity": "sha512-eESK5yfPNTqpAmDfFWNsOhmIOaQA59tAcF/EfYvo5/QWQCzXn5iUSOnqt3ra3UdzBv073ykTtmeLJZGt3HhA+w==", | ||||
|             "version": "0.25.4", | ||||
|             "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.4.tgz", | ||||
|             "integrity": "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==", | ||||
|             "cpu": [ | ||||
|                 "arm64" | ||||
|             ], | ||||
| @@ -1754,9 +1755,9 @@ | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/@esbuild/darwin-x64": { | ||||
|             "version": "0.25.3", | ||||
|             "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.3.tgz", | ||||
|             "integrity": "sha512-Kd8glo7sIZtwOLcPbW0yLpKmBNWMANZhrC1r6K++uDR2zyzb6AeOYtI6udbtabmQpFaxJ8uduXMAo1gs5ozz8A==", | ||||
|             "version": "0.25.4", | ||||
|             "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.4.tgz", | ||||
|             "integrity": "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==", | ||||
|             "cpu": [ | ||||
|                 "x64" | ||||
|             ], | ||||
| @@ -1771,9 +1772,9 @@ | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/@esbuild/freebsd-arm64": { | ||||
|             "version": "0.25.3", | ||||
|             "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.3.tgz", | ||||
|             "integrity": "sha512-EJiyS70BYybOBpJth3M0KLOus0n+RRMKTYzhYhFeMwp7e/RaajXvP+BWlmEXNk6uk+KAu46j/kaQzr6au+JcIw==", | ||||
|             "version": "0.25.4", | ||||
|             "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.4.tgz", | ||||
|             "integrity": "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==", | ||||
|             "cpu": [ | ||||
|                 "arm64" | ||||
|             ], | ||||
| @@ -1788,9 +1789,9 @@ | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/@esbuild/freebsd-x64": { | ||||
|             "version": "0.25.3", | ||||
|             "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.3.tgz", | ||||
|             "integrity": "sha512-Q+wSjaLpGxYf7zC0kL0nDlhsfuFkoN+EXrx2KSB33RhinWzejOd6AvgmP5JbkgXKmjhmpfgKZq24pneodYqE8Q==", | ||||
|             "version": "0.25.4", | ||||
|             "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.4.tgz", | ||||
|             "integrity": "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==", | ||||
|             "cpu": [ | ||||
|                 "x64" | ||||
|             ], | ||||
| @@ -1805,9 +1806,9 @@ | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/@esbuild/linux-arm": { | ||||
|             "version": "0.25.3", | ||||
|             "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.3.tgz", | ||||
|             "integrity": "sha512-dUOVmAUzuHy2ZOKIHIKHCm58HKzFqd+puLaS424h6I85GlSDRZIA5ycBixb3mFgM0Jdh+ZOSB6KptX30DD8YOQ==", | ||||
|             "version": "0.25.4", | ||||
|             "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.4.tgz", | ||||
|             "integrity": "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==", | ||||
|             "cpu": [ | ||||
|                 "arm" | ||||
|             ], | ||||
| @@ -1822,9 +1823,9 @@ | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/@esbuild/linux-arm64": { | ||||
|             "version": "0.25.3", | ||||
|             "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.3.tgz", | ||||
|             "integrity": "sha512-xCUgnNYhRD5bb1C1nqrDV1PfkwgbswTTBRbAd8aH5PhYzikdf/ddtsYyMXFfGSsb/6t6QaPSzxtbfAZr9uox4A==", | ||||
|             "version": "0.25.4", | ||||
|             "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.4.tgz", | ||||
|             "integrity": "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==", | ||||
|             "cpu": [ | ||||
|                 "arm64" | ||||
|             ], | ||||
| @@ -1839,9 +1840,9 @@ | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/@esbuild/linux-ia32": { | ||||
|             "version": "0.25.3", | ||||
|             "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.3.tgz", | ||||
|             "integrity": "sha512-yplPOpczHOO4jTYKmuYuANI3WhvIPSVANGcNUeMlxH4twz/TeXuzEP41tGKNGWJjuMhotpGabeFYGAOU2ummBw==", | ||||
|             "version": "0.25.4", | ||||
|             "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.4.tgz", | ||||
|             "integrity": "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==", | ||||
|             "cpu": [ | ||||
|                 "ia32" | ||||
|             ], | ||||
| @@ -1856,9 +1857,9 @@ | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/@esbuild/linux-loong64": { | ||||
|             "version": "0.25.3", | ||||
|             "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.3.tgz", | ||||
|             "integrity": "sha512-P4BLP5/fjyihmXCELRGrLd793q/lBtKMQl8ARGpDxgzgIKJDRJ/u4r1A/HgpBpKpKZelGct2PGI4T+axcedf6g==", | ||||
|             "version": "0.25.4", | ||||
|             "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.4.tgz", | ||||
|             "integrity": "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==", | ||||
|             "cpu": [ | ||||
|                 "loong64" | ||||
|             ], | ||||
| @@ -1873,9 +1874,9 @@ | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/@esbuild/linux-mips64el": { | ||||
|             "version": "0.25.3", | ||||
|             "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.3.tgz", | ||||
|             "integrity": "sha512-eRAOV2ODpu6P5divMEMa26RRqb2yUoYsuQQOuFUexUoQndm4MdpXXDBbUoKIc0iPa4aCO7gIhtnYomkn2x+bag==", | ||||
|             "version": "0.25.4", | ||||
|             "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.4.tgz", | ||||
|             "integrity": "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==", | ||||
|             "cpu": [ | ||||
|                 "mips64el" | ||||
|             ], | ||||
| @@ -1890,9 +1891,9 @@ | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/@esbuild/linux-ppc64": { | ||||
|             "version": "0.25.3", | ||||
|             "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.3.tgz", | ||||
|             "integrity": "sha512-ZC4jV2p7VbzTlnl8nZKLcBkfzIf4Yad1SJM4ZMKYnJqZFD4rTI+pBG65u8ev4jk3/MPwY9DvGn50wi3uhdaghg==", | ||||
|             "version": "0.25.4", | ||||
|             "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.4.tgz", | ||||
|             "integrity": "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==", | ||||
|             "cpu": [ | ||||
|                 "ppc64" | ||||
|             ], | ||||
| @@ -1907,9 +1908,9 @@ | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/@esbuild/linux-riscv64": { | ||||
|             "version": "0.25.3", | ||||
|             "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.3.tgz", | ||||
|             "integrity": "sha512-LDDODcFzNtECTrUUbVCs6j9/bDVqy7DDRsuIXJg6so+mFksgwG7ZVnTruYi5V+z3eE5y+BJZw7VvUadkbfg7QA==", | ||||
|             "version": "0.25.4", | ||||
|             "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.4.tgz", | ||||
|             "integrity": "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==", | ||||
|             "cpu": [ | ||||
|                 "riscv64" | ||||
|             ], | ||||
| @@ -1924,9 +1925,9 @@ | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/@esbuild/linux-s390x": { | ||||
|             "version": "0.25.3", | ||||
|             "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.3.tgz", | ||||
|             "integrity": "sha512-s+w/NOY2k0yC2p9SLen+ymflgcpRkvwwa02fqmAwhBRI3SC12uiS10edHHXlVWwfAagYSY5UpmT/zISXPMW3tQ==", | ||||
|             "version": "0.25.4", | ||||
|             "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.4.tgz", | ||||
|             "integrity": "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==", | ||||
|             "cpu": [ | ||||
|                 "s390x" | ||||
|             ], | ||||
| @@ -1941,9 +1942,9 @@ | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/@esbuild/linux-x64": { | ||||
|             "version": "0.25.3", | ||||
|             "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.3.tgz", | ||||
|             "integrity": "sha512-nQHDz4pXjSDC6UfOE1Fw9Q8d6GCAd9KdvMZpfVGWSJztYCarRgSDfOVBY5xwhQXseiyxapkiSJi/5/ja8mRFFA==", | ||||
|             "version": "0.25.4", | ||||
|             "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.4.tgz", | ||||
|             "integrity": "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==", | ||||
|             "cpu": [ | ||||
|                 "x64" | ||||
|             ], | ||||
| @@ -1958,9 +1959,9 @@ | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/@esbuild/netbsd-arm64": { | ||||
|             "version": "0.25.3", | ||||
|             "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.3.tgz", | ||||
|             "integrity": "sha512-1QaLtOWq0mzK6tzzp0jRN3eccmN3hezey7mhLnzC6oNlJoUJz4nym5ZD7mDnS/LZQgkrhEbEiTn515lPeLpgWA==", | ||||
|             "version": "0.25.4", | ||||
|             "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.4.tgz", | ||||
|             "integrity": "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==", | ||||
|             "cpu": [ | ||||
|                 "arm64" | ||||
|             ], | ||||
| @@ -1975,9 +1976,9 @@ | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/@esbuild/netbsd-x64": { | ||||
|             "version": "0.25.3", | ||||
|             "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.3.tgz", | ||||
|             "integrity": "sha512-i5Hm68HXHdgv8wkrt+10Bc50zM0/eonPb/a/OFVfB6Qvpiirco5gBA5bz7S2SHuU+Y4LWn/zehzNX14Sp4r27g==", | ||||
|             "version": "0.25.4", | ||||
|             "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.4.tgz", | ||||
|             "integrity": "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==", | ||||
|             "cpu": [ | ||||
|                 "x64" | ||||
|             ], | ||||
| @@ -1992,9 +1993,9 @@ | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/@esbuild/openbsd-arm64": { | ||||
|             "version": "0.25.3", | ||||
|             "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.3.tgz", | ||||
|             "integrity": "sha512-zGAVApJEYTbOC6H/3QBr2mq3upG/LBEXr85/pTtKiv2IXcgKV0RT0QA/hSXZqSvLEpXeIxah7LczB4lkiYhTAQ==", | ||||
|             "version": "0.25.4", | ||||
|             "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.4.tgz", | ||||
|             "integrity": "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==", | ||||
|             "cpu": [ | ||||
|                 "arm64" | ||||
|             ], | ||||
| @@ -2009,9 +2010,9 @@ | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/@esbuild/openbsd-x64": { | ||||
|             "version": "0.25.3", | ||||
|             "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.3.tgz", | ||||
|             "integrity": "sha512-fpqctI45NnCIDKBH5AXQBsD0NDPbEFczK98hk/aa6HJxbl+UtLkJV2+Bvy5hLSLk3LHmqt0NTkKNso1A9y1a4w==", | ||||
|             "version": "0.25.4", | ||||
|             "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.4.tgz", | ||||
|             "integrity": "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==", | ||||
|             "cpu": [ | ||||
|                 "x64" | ||||
|             ], | ||||
| @@ -2026,9 +2027,9 @@ | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/@esbuild/sunos-x64": { | ||||
|             "version": "0.25.3", | ||||
|             "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.3.tgz", | ||||
|             "integrity": "sha512-ROJhm7d8bk9dMCUZjkS8fgzsPAZEjtRJqCAmVgB0gMrvG7hfmPmz9k1rwO4jSiblFjYmNvbECL9uhaPzONMfgA==", | ||||
|             "version": "0.25.4", | ||||
|             "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.4.tgz", | ||||
|             "integrity": "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==", | ||||
|             "cpu": [ | ||||
|                 "x64" | ||||
|             ], | ||||
| @@ -2043,9 +2044,9 @@ | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/@esbuild/win32-arm64": { | ||||
|             "version": "0.25.3", | ||||
|             "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.3.tgz", | ||||
|             "integrity": "sha512-YWcow8peiHpNBiIXHwaswPnAXLsLVygFwCB3A7Bh5jRkIBFWHGmNQ48AlX4xDvQNoMZlPYzjVOQDYEzWCqufMQ==", | ||||
|             "version": "0.25.4", | ||||
|             "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.4.tgz", | ||||
|             "integrity": "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==", | ||||
|             "cpu": [ | ||||
|                 "arm64" | ||||
|             ], | ||||
| @@ -2060,9 +2061,9 @@ | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/@esbuild/win32-ia32": { | ||||
|             "version": "0.25.3", | ||||
|             "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.3.tgz", | ||||
|             "integrity": "sha512-qspTZOIGoXVS4DpNqUYUs9UxVb04khS1Degaw/MnfMe7goQ3lTfQ13Vw4qY/Nj0979BGvMRpAYbs/BAxEvU8ew==", | ||||
|             "version": "0.25.4", | ||||
|             "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.4.tgz", | ||||
|             "integrity": "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==", | ||||
|             "cpu": [ | ||||
|                 "ia32" | ||||
|             ], | ||||
| @@ -2077,9 +2078,9 @@ | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/@esbuild/win32-x64": { | ||||
|             "version": "0.25.3", | ||||
|             "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.3.tgz", | ||||
|             "integrity": "sha512-ICgUR+kPimx0vvRzf+N/7L7tVSQeE3BYY+NhHRHXS1kBuPO7z2+7ea2HbhDyZdTephgvNvKrlDDKUexuCVBVvg==", | ||||
|             "version": "0.25.4", | ||||
|             "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.4.tgz", | ||||
|             "integrity": "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==", | ||||
|             "cpu": [ | ||||
|                 "x64" | ||||
|             ], | ||||
| @@ -2551,9 +2552,9 @@ | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/@rollup/rollup-android-arm-eabi": { | ||||
|             "version": "4.40.1", | ||||
|             "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.1.tgz", | ||||
|             "integrity": "sha512-kxz0YeeCrRUHz3zyqvd7n+TVRlNyTifBsmnmNPtk3hQURUyG9eAB+usz6DAwagMusjx/zb3AjvDUvhFGDAexGw==", | ||||
|             "version": "4.40.2", | ||||
|             "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.2.tgz", | ||||
|             "integrity": "sha512-JkdNEq+DFxZfUwxvB58tHMHBHVgX23ew41g1OQinthJ+ryhdRk67O31S7sYw8u2lTjHUPFxwar07BBt1KHp/hg==", | ||||
|             "cpu": [ | ||||
|                 "arm" | ||||
|             ], | ||||
| @@ -2565,9 +2566,9 @@ | ||||
|             ] | ||||
|         }, | ||||
|         "node_modules/@rollup/rollup-android-arm64": { | ||||
|             "version": "4.40.1", | ||||
|             "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.1.tgz", | ||||
|             "integrity": "sha512-PPkxTOisoNC6TpnDKatjKkjRMsdaWIhyuMkA4UsBXT9WEZY4uHezBTjs6Vl4PbqQQeu6oION1w2voYZv9yquCw==", | ||||
|             "version": "4.40.2", | ||||
|             "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.2.tgz", | ||||
|             "integrity": "sha512-13unNoZ8NzUmnndhPTkWPWbX3vtHodYmy+I9kuLxN+F+l+x3LdVF7UCu8TWVMt1POHLh6oDHhnOA04n8oJZhBw==", | ||||
|             "cpu": [ | ||||
|                 "arm64" | ||||
|             ], | ||||
| @@ -2579,9 +2580,9 @@ | ||||
|             ] | ||||
|         }, | ||||
|         "node_modules/@rollup/rollup-darwin-arm64": { | ||||
|             "version": "4.40.1", | ||||
|             "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.1.tgz", | ||||
|             "integrity": "sha512-VWXGISWFY18v/0JyNUy4A46KCFCb9NVsH+1100XP31lud+TzlezBbz24CYzbnA4x6w4hx+NYCXDfnvDVO6lcAA==", | ||||
|             "version": "4.40.2", | ||||
|             "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.2.tgz", | ||||
|             "integrity": "sha512-Gzf1Hn2Aoe8VZzevHostPX23U7N5+4D36WJNHK88NZHCJr7aVMG4fadqkIf72eqVPGjGc0HJHNuUaUcxiR+N/w==", | ||||
|             "cpu": [ | ||||
|                 "arm64" | ||||
|             ], | ||||
| @@ -2593,9 +2594,9 @@ | ||||
|             ] | ||||
|         }, | ||||
|         "node_modules/@rollup/rollup-darwin-x64": { | ||||
|             "version": "4.40.1", | ||||
|             "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.1.tgz", | ||||
|             "integrity": "sha512-nIwkXafAI1/QCS7pxSpv/ZtFW6TXcNUEHAIA9EIyw5OzxJZQ1YDrX+CL6JAIQgZ33CInl1R6mHet9Y/UZTg2Bw==", | ||||
|             "version": "4.40.2", | ||||
|             "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.2.tgz", | ||||
|             "integrity": "sha512-47N4hxa01a4x6XnJoskMKTS8XZ0CZMd8YTbINbi+w03A2w4j1RTlnGHOz/P0+Bg1LaVL6ufZyNprSg+fW5nYQQ==", | ||||
|             "cpu": [ | ||||
|                 "x64" | ||||
|             ], | ||||
| @@ -2607,9 +2608,9 @@ | ||||
|             ] | ||||
|         }, | ||||
|         "node_modules/@rollup/rollup-freebsd-arm64": { | ||||
|             "version": "4.40.1", | ||||
|             "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.1.tgz", | ||||
|             "integrity": "sha512-BdrLJ2mHTrIYdaS2I99mriyJfGGenSaP+UwGi1kB9BLOCu9SR8ZpbkmmalKIALnRw24kM7qCN0IOm6L0S44iWw==", | ||||
|             "version": "4.40.2", | ||||
|             "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.2.tgz", | ||||
|             "integrity": "sha512-8t6aL4MD+rXSHHZUR1z19+9OFJ2rl1wGKvckN47XFRVO+QL/dUSpKA2SLRo4vMg7ELA8pzGpC+W9OEd1Z/ZqoQ==", | ||||
|             "cpu": [ | ||||
|                 "arm64" | ||||
|             ], | ||||
| @@ -2621,9 +2622,9 @@ | ||||
|             ] | ||||
|         }, | ||||
|         "node_modules/@rollup/rollup-freebsd-x64": { | ||||
|             "version": "4.40.1", | ||||
|             "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.1.tgz", | ||||
|             "integrity": "sha512-VXeo/puqvCG8JBPNZXZf5Dqq7BzElNJzHRRw3vjBE27WujdzuOPecDPc/+1DcdcTptNBep3861jNq0mYkT8Z6Q==", | ||||
|             "version": "4.40.2", | ||||
|             "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.2.tgz", | ||||
|             "integrity": "sha512-C+AyHBzfpsOEYRFjztcYUFsH4S7UsE9cDtHCtma5BK8+ydOZYgMmWg1d/4KBytQspJCld8ZIujFMAdKG1xyr4Q==", | ||||
|             "cpu": [ | ||||
|                 "x64" | ||||
|             ], | ||||
| @@ -2635,9 +2636,9 @@ | ||||
|             ] | ||||
|         }, | ||||
|         "node_modules/@rollup/rollup-linux-arm-gnueabihf": { | ||||
|             "version": "4.40.1", | ||||
|             "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.1.tgz", | ||||
|             "integrity": "sha512-ehSKrewwsESPt1TgSE/na9nIhWCosfGSFqv7vwEtjyAqZcvbGIg4JAcV7ZEh2tfj/IlfBeZjgOXm35iOOjadcg==", | ||||
|             "version": "4.40.2", | ||||
|             "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.2.tgz", | ||||
|             "integrity": "sha512-de6TFZYIvJwRNjmW3+gaXiZ2DaWL5D5yGmSYzkdzjBDS3W+B9JQ48oZEsmMvemqjtAFzE16DIBLqd6IQQRuG9Q==", | ||||
|             "cpu": [ | ||||
|                 "arm" | ||||
|             ], | ||||
| @@ -2649,9 +2650,9 @@ | ||||
|             ] | ||||
|         }, | ||||
|         "node_modules/@rollup/rollup-linux-arm-musleabihf": { | ||||
|             "version": "4.40.1", | ||||
|             "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.1.tgz", | ||||
|             "integrity": "sha512-m39iO/aaurh5FVIu/F4/Zsl8xppd76S4qoID8E+dSRQvTyZTOI2gVk3T4oqzfq1PtcvOfAVlwLMK3KRQMaR8lg==", | ||||
|             "version": "4.40.2", | ||||
|             "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.2.tgz", | ||||
|             "integrity": "sha512-urjaEZubdIkacKc930hUDOfQPysezKla/O9qV+O89enqsqUmQm8Xj8O/vh0gHg4LYfv7Y7UsE3QjzLQzDYN1qg==", | ||||
|             "cpu": [ | ||||
|                 "arm" | ||||
|             ], | ||||
| @@ -2663,9 +2664,9 @@ | ||||
|             ] | ||||
|         }, | ||||
|         "node_modules/@rollup/rollup-linux-arm64-gnu": { | ||||
|             "version": "4.40.1", | ||||
|             "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.1.tgz", | ||||
|             "integrity": "sha512-Y+GHnGaku4aVLSgrT0uWe2o2Rq8te9hi+MwqGF9r9ORgXhmHK5Q71N757u0F8yU1OIwUIFy6YiJtKjtyktk5hg==", | ||||
|             "version": "4.40.2", | ||||
|             "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.2.tgz", | ||||
|             "integrity": "sha512-KlE8IC0HFOC33taNt1zR8qNlBYHj31qGT1UqWqtvR/+NuCVhfufAq9fxO8BMFC22Wu0rxOwGVWxtCMvZVLmhQg==", | ||||
|             "cpu": [ | ||||
|                 "arm64" | ||||
|             ], | ||||
| @@ -2677,9 +2678,9 @@ | ||||
|             ] | ||||
|         }, | ||||
|         "node_modules/@rollup/rollup-linux-arm64-musl": { | ||||
|             "version": "4.40.1", | ||||
|             "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.1.tgz", | ||||
|             "integrity": "sha512-jEwjn3jCA+tQGswK3aEWcD09/7M5wGwc6+flhva7dsQNRZZTe30vkalgIzV4tjkopsTS9Jd7Y1Bsj6a4lzz8gQ==", | ||||
|             "version": "4.40.2", | ||||
|             "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.2.tgz", | ||||
|             "integrity": "sha512-j8CgxvfM0kbnhu4XgjnCWJQyyBOeBI1Zq91Z850aUddUmPeQvuAy6OiMdPS46gNFgy8gN1xkYyLgwLYZG3rBOg==", | ||||
|             "cpu": [ | ||||
|                 "arm64" | ||||
|             ], | ||||
| @@ -2691,9 +2692,9 @@ | ||||
|             ] | ||||
|         }, | ||||
|         "node_modules/@rollup/rollup-linux-loongarch64-gnu": { | ||||
|             "version": "4.40.1", | ||||
|             "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.1.tgz", | ||||
|             "integrity": "sha512-ySyWikVhNzv+BV/IDCsrraOAZ3UaC8SZB67FZlqVwXwnFhPihOso9rPOxzZbjp81suB1O2Topw+6Ug3JNegejQ==", | ||||
|             "version": "4.40.2", | ||||
|             "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.2.tgz", | ||||
|             "integrity": "sha512-Ybc/1qUampKuRF4tQXc7G7QY9YRyeVSykfK36Y5Qc5dmrIxwFhrOzqaVTNoZygqZ1ZieSWTibfFhQ5qK8jpWxw==", | ||||
|             "cpu": [ | ||||
|                 "loong64" | ||||
|             ], | ||||
| @@ -2705,9 +2706,9 @@ | ||||
|             ] | ||||
|         }, | ||||
|         "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { | ||||
|             "version": "4.40.1", | ||||
|             "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.1.tgz", | ||||
|             "integrity": "sha512-BvvA64QxZlh7WZWqDPPdt0GH4bznuL6uOO1pmgPnnv86rpUpc8ZxgZwcEgXvo02GRIZX1hQ0j0pAnhwkhwPqWg==", | ||||
|             "version": "4.40.2", | ||||
|             "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.2.tgz", | ||||
|             "integrity": "sha512-3FCIrnrt03CCsZqSYAOW/k9n625pjpuMzVfeI+ZBUSDT3MVIFDSPfSUgIl9FqUftxcUXInvFah79hE1c9abD+Q==", | ||||
|             "cpu": [ | ||||
|                 "ppc64" | ||||
|             ], | ||||
| @@ -2719,9 +2720,9 @@ | ||||
|             ] | ||||
|         }, | ||||
|         "node_modules/@rollup/rollup-linux-riscv64-gnu": { | ||||
|             "version": "4.40.1", | ||||
|             "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.1.tgz", | ||||
|             "integrity": "sha512-EQSP+8+1VuSulm9RKSMKitTav89fKbHymTf25n5+Yr6gAPZxYWpj3DzAsQqoaHAk9YX2lwEyAf9S4W8F4l3VBQ==", | ||||
|             "version": "4.40.2", | ||||
|             "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.2.tgz", | ||||
|             "integrity": "sha512-QNU7BFHEvHMp2ESSY3SozIkBPaPBDTsfVNGx3Xhv+TdvWXFGOSH2NJvhD1zKAT6AyuuErJgbdvaJhYVhVqrWTg==", | ||||
|             "cpu": [ | ||||
|                 "riscv64" | ||||
|             ], | ||||
| @@ -2733,9 +2734,9 @@ | ||||
|             ] | ||||
|         }, | ||||
|         "node_modules/@rollup/rollup-linux-riscv64-musl": { | ||||
|             "version": "4.40.1", | ||||
|             "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.1.tgz", | ||||
|             "integrity": "sha512-n/vQ4xRZXKuIpqukkMXZt9RWdl+2zgGNx7Uda8NtmLJ06NL8jiHxUawbwC+hdSq1rrw/9CghCpEONor+l1e2gA==", | ||||
|             "version": "4.40.2", | ||||
|             "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.2.tgz", | ||||
|             "integrity": "sha512-5W6vNYkhgfh7URiXTO1E9a0cy4fSgfE4+Hl5agb/U1sa0kjOLMLC1wObxwKxecE17j0URxuTrYZZME4/VH57Hg==", | ||||
|             "cpu": [ | ||||
|                 "riscv64" | ||||
|             ], | ||||
| @@ -2747,9 +2748,9 @@ | ||||
|             ] | ||||
|         }, | ||||
|         "node_modules/@rollup/rollup-linux-s390x-gnu": { | ||||
|             "version": "4.40.1", | ||||
|             "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.1.tgz", | ||||
|             "integrity": "sha512-h8d28xzYb98fMQKUz0w2fMc1XuGzLLjdyxVIbhbil4ELfk5/orZlSTpF/xdI9C8K0I8lCkq+1En2RJsawZekkg==", | ||||
|             "version": "4.40.2", | ||||
|             "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.2.tgz", | ||||
|             "integrity": "sha512-B7LKIz+0+p348JoAL4X/YxGx9zOx3sR+o6Hj15Y3aaApNfAshK8+mWZEf759DXfRLeL2vg5LYJBB7DdcleYCoQ==", | ||||
|             "cpu": [ | ||||
|                 "s390x" | ||||
|             ], | ||||
| @@ -2761,9 +2762,9 @@ | ||||
|             ] | ||||
|         }, | ||||
|         "node_modules/@rollup/rollup-linux-x64-gnu": { | ||||
|             "version": "4.40.1", | ||||
|             "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.1.tgz", | ||||
|             "integrity": "sha512-XiK5z70PEFEFqcNj3/zRSz/qX4bp4QIraTy9QjwJAb/Z8GM7kVUsD0Uk8maIPeTyPCP03ChdI+VVmJriKYbRHQ==", | ||||
|             "version": "4.40.2", | ||||
|             "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.2.tgz", | ||||
|             "integrity": "sha512-lG7Xa+BmBNwpjmVUbmyKxdQJ3Q6whHjMjzQplOs5Z+Gj7mxPtWakGHqzMqNER68G67kmCX9qX57aRsW5V0VOng==", | ||||
|             "cpu": [ | ||||
|                 "x64" | ||||
|             ], | ||||
| @@ -2775,9 +2776,9 @@ | ||||
|             ] | ||||
|         }, | ||||
|         "node_modules/@rollup/rollup-linux-x64-musl": { | ||||
|             "version": "4.40.1", | ||||
|             "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.1.tgz", | ||||
|             "integrity": "sha512-2BRORitq5rQ4Da9blVovzNCMaUlyKrzMSvkVR0D4qPuOy/+pMCrh1d7o01RATwVy+6Fa1WBw+da7QPeLWU/1mQ==", | ||||
|             "version": "4.40.2", | ||||
|             "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.2.tgz", | ||||
|             "integrity": "sha512-tD46wKHd+KJvsmije4bUskNuvWKFcTOIM9tZ/RrmIvcXnbi0YK/cKS9FzFtAm7Oxi2EhV5N2OpfFB348vSQRXA==", | ||||
|             "cpu": [ | ||||
|                 "x64" | ||||
|             ], | ||||
| @@ -2789,9 +2790,9 @@ | ||||
|             ] | ||||
|         }, | ||||
|         "node_modules/@rollup/rollup-win32-arm64-msvc": { | ||||
|             "version": "4.40.1", | ||||
|             "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.1.tgz", | ||||
|             "integrity": "sha512-b2bcNm9Kbde03H+q+Jjw9tSfhYkzrDUf2d5MAd1bOJuVplXvFhWz7tRtWvD8/ORZi7qSCy0idW6tf2HgxSXQSg==", | ||||
|             "version": "4.40.2", | ||||
|             "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.2.tgz", | ||||
|             "integrity": "sha512-Bjv/HG8RRWLNkXwQQemdsWw4Mg+IJ29LK+bJPW2SCzPKOUaMmPEppQlu/Fqk1d7+DX3V7JbFdbkh/NMmurT6Pg==", | ||||
|             "cpu": [ | ||||
|                 "arm64" | ||||
|             ], | ||||
| @@ -2803,9 +2804,9 @@ | ||||
|             ] | ||||
|         }, | ||||
|         "node_modules/@rollup/rollup-win32-ia32-msvc": { | ||||
|             "version": "4.40.1", | ||||
|             "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.1.tgz", | ||||
|             "integrity": "sha512-DfcogW8N7Zg7llVEfpqWMZcaErKfsj9VvmfSyRjCyo4BI3wPEfrzTtJkZG6gKP/Z92wFm6rz2aDO7/JfiR/whA==", | ||||
|             "version": "4.40.2", | ||||
|             "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.2.tgz", | ||||
|             "integrity": "sha512-dt1llVSGEsGKvzeIO76HToiYPNPYPkmjhMHhP00T9S4rDern8P2ZWvWAQUEJ+R1UdMWJ/42i/QqJ2WV765GZcA==", | ||||
|             "cpu": [ | ||||
|                 "ia32" | ||||
|             ], | ||||
| @@ -2817,9 +2818,9 @@ | ||||
|             ] | ||||
|         }, | ||||
|         "node_modules/@rollup/rollup-win32-x64-msvc": { | ||||
|             "version": "4.40.1", | ||||
|             "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.1.tgz", | ||||
|             "integrity": "sha512-ECyOuDeH3C1I8jH2MK1RtBJW+YPMvSfT0a5NN0nHfQYnDSJ6tUiZH3gzwVP5/Kfh/+Tt7tpWVF9LXNTnhTJ3kA==", | ||||
|             "version": "4.40.2", | ||||
|             "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.2.tgz", | ||||
|             "integrity": "sha512-bwspbWB04XJpeElvsp+DCylKfF4trJDa2Y9Go8O6A7YLX2LIKGcNK/CYImJN6ZP4DcuOHB4Utl3iCbnR62DudA==", | ||||
|             "cpu": [ | ||||
|                 "x64" | ||||
|             ], | ||||
| @@ -3107,9 +3108,9 @@ | ||||
|             "license": "MIT" | ||||
|         }, | ||||
|         "node_modules/@types/node": { | ||||
|             "version": "22.15.3", | ||||
|             "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.3.tgz", | ||||
|             "integrity": "sha512-lX7HFZeHf4QG/J7tBZqrCAXwz9J5RD56Y6MpP0eJkka8p+K0RY/yBTW7CYFJ4VGCclxqOLKmiGP5juQc6MKgcw==", | ||||
|             "version": "22.15.17", | ||||
|             "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.17.tgz", | ||||
|             "integrity": "sha512-wIX2aSZL5FE+MR0JlvF87BNVrtFWf6AE6rxSE9X7OwnVvoyCQjpzSRJ+M87se/4QCkCiebQAqrJ0y6fwIyi7nw==", | ||||
|             "dev": true, | ||||
|             "license": "MIT", | ||||
|             "dependencies": { | ||||
| @@ -4100,9 +4101,9 @@ | ||||
|             "license": "ISC" | ||||
|         }, | ||||
|         "node_modules/bootstrap": { | ||||
|             "version": "5.3.5", | ||||
|             "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.5.tgz", | ||||
|             "integrity": "sha512-ct1CHKtiobRimyGzmsSldEtM03E8fcEX4Tb3dGXz1V8faRwM50+vfHwTzOxB3IlKO7m+9vTH3s/3C6T2EAPeTA==", | ||||
|             "version": "5.3.6", | ||||
|             "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.6.tgz", | ||||
|             "integrity": "sha512-jX0GAcRzvdwISuvArXn3m7KZscWWFAf1MKBcnzaN02qWMb3jpMoUX4/qgeiGzqyIb4ojulRzs89UCUmGcFSzTA==", | ||||
|             "funding": [ | ||||
|                 { | ||||
|                     "type": "github", | ||||
| @@ -5631,9 +5632,9 @@ | ||||
|             "license": "MIT" | ||||
|         }, | ||||
|         "node_modules/electron-to-chromium": { | ||||
|             "version": "1.5.149", | ||||
|             "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.149.tgz", | ||||
|             "integrity": "sha512-UyiO82eb9dVOx8YO3ajDf9jz2kKyt98DEITRdeLPstOEuTlLzDA4Gyq5K9he71TQziU5jUVu2OAu5N48HmQiyQ==", | ||||
|             "version": "1.5.151", | ||||
|             "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.151.tgz", | ||||
|             "integrity": "sha512-Rl6uugut2l9sLojjS4H4SAr3A4IgACMLgpuEMPYCVcKydzfyPrn5absNRju38IhQOf/NwjJY8OGWjlteqYeBCA==", | ||||
|             "dev": true, | ||||
|             "license": "ISC" | ||||
|         }, | ||||
| @@ -5794,9 +5795,9 @@ | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/esbuild": { | ||||
|             "version": "0.25.3", | ||||
|             "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.3.tgz", | ||||
|             "integrity": "sha512-qKA6Pvai73+M2FtftpNKRxJ78GIjmFXFxd/1DVBqGo/qNhLSfv+G12n9pNoWdytJC8U00TrViOwpjT0zgqQS8Q==", | ||||
|             "version": "0.25.4", | ||||
|             "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.4.tgz", | ||||
|             "integrity": "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==", | ||||
|             "dev": true, | ||||
|             "hasInstallScript": true, | ||||
|             "license": "MIT", | ||||
| @@ -5807,31 +5808,31 @@ | ||||
|                 "node": ">=18" | ||||
|             }, | ||||
|             "optionalDependencies": { | ||||
|                 "@esbuild/aix-ppc64": "0.25.3", | ||||
|                 "@esbuild/android-arm": "0.25.3", | ||||
|                 "@esbuild/android-arm64": "0.25.3", | ||||
|                 "@esbuild/android-x64": "0.25.3", | ||||
|                 "@esbuild/darwin-arm64": "0.25.3", | ||||
|                 "@esbuild/darwin-x64": "0.25.3", | ||||
|                 "@esbuild/freebsd-arm64": "0.25.3", | ||||
|                 "@esbuild/freebsd-x64": "0.25.3", | ||||
|                 "@esbuild/linux-arm": "0.25.3", | ||||
|                 "@esbuild/linux-arm64": "0.25.3", | ||||
|                 "@esbuild/linux-ia32": "0.25.3", | ||||
|                 "@esbuild/linux-loong64": "0.25.3", | ||||
|                 "@esbuild/linux-mips64el": "0.25.3", | ||||
|                 "@esbuild/linux-ppc64": "0.25.3", | ||||
|                 "@esbuild/linux-riscv64": "0.25.3", | ||||
|                 "@esbuild/linux-s390x": "0.25.3", | ||||
|                 "@esbuild/linux-x64": "0.25.3", | ||||
|                 "@esbuild/netbsd-arm64": "0.25.3", | ||||
|                 "@esbuild/netbsd-x64": "0.25.3", | ||||
|                 "@esbuild/openbsd-arm64": "0.25.3", | ||||
|                 "@esbuild/openbsd-x64": "0.25.3", | ||||
|                 "@esbuild/sunos-x64": "0.25.3", | ||||
|                 "@esbuild/win32-arm64": "0.25.3", | ||||
|                 "@esbuild/win32-ia32": "0.25.3", | ||||
|                 "@esbuild/win32-x64": "0.25.3" | ||||
|                 "@esbuild/aix-ppc64": "0.25.4", | ||||
|                 "@esbuild/android-arm": "0.25.4", | ||||
|                 "@esbuild/android-arm64": "0.25.4", | ||||
|                 "@esbuild/android-x64": "0.25.4", | ||||
|                 "@esbuild/darwin-arm64": "0.25.4", | ||||
|                 "@esbuild/darwin-x64": "0.25.4", | ||||
|                 "@esbuild/freebsd-arm64": "0.25.4", | ||||
|                 "@esbuild/freebsd-x64": "0.25.4", | ||||
|                 "@esbuild/linux-arm": "0.25.4", | ||||
|                 "@esbuild/linux-arm64": "0.25.4", | ||||
|                 "@esbuild/linux-ia32": "0.25.4", | ||||
|                 "@esbuild/linux-loong64": "0.25.4", | ||||
|                 "@esbuild/linux-mips64el": "0.25.4", | ||||
|                 "@esbuild/linux-ppc64": "0.25.4", | ||||
|                 "@esbuild/linux-riscv64": "0.25.4", | ||||
|                 "@esbuild/linux-s390x": "0.25.4", | ||||
|                 "@esbuild/linux-x64": "0.25.4", | ||||
|                 "@esbuild/netbsd-arm64": "0.25.4", | ||||
|                 "@esbuild/netbsd-x64": "0.25.4", | ||||
|                 "@esbuild/openbsd-arm64": "0.25.4", | ||||
|                 "@esbuild/openbsd-x64": "0.25.4", | ||||
|                 "@esbuild/sunos-x64": "0.25.4", | ||||
|                 "@esbuild/win32-arm64": "0.25.4", | ||||
|                 "@esbuild/win32-ia32": "0.25.4", | ||||
|                 "@esbuild/win32-x64": "0.25.4" | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/escalade": { | ||||
| @@ -6975,9 +6976,9 @@ | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/i18next": { | ||||
|             "version": "25.0.2", | ||||
|             "resolved": "https://registry.npmjs.org/i18next/-/i18next-25.0.2.tgz", | ||||
|             "integrity": "sha512-xWxgK8GAaPYkV9ia2tdgbtdM+qiC+ysVTBPvXhpCORU/+QkeQe3BSI7Crr+c4ZXULN1PfnXG/HY2n7HGx4KKBg==", | ||||
|             "version": "25.1.2", | ||||
|             "resolved": "https://registry.npmjs.org/i18next/-/i18next-25.1.2.tgz", | ||||
|             "integrity": "sha512-SP63m8LzdjkrAjruH7SCI3ndPSgjt4/wX7ouUUOzCW/eY+HzlIo19IQSfYA9X3qRiRP1SYtaTsg/Oz/PGsfD8w==", | ||||
|             "funding": [ | ||||
|                 { | ||||
|                     "type": "individual", | ||||
| @@ -7153,9 +7154,9 @@ | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/immutable": { | ||||
|             "version": "5.1.1", | ||||
|             "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.1.tgz", | ||||
|             "integrity": "sha512-3jatXi9ObIsPGr3N5hGw/vWWcTkq6hUYhpQz4k0wLC+owqWi/LiugIw9x0EdNZ2yGedKN/HzePiBvaJRXa0Ujg==", | ||||
|             "version": "5.1.2", | ||||
|             "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.2.tgz", | ||||
|             "integrity": "sha512-qHKXW1q6liAk1Oys6umoaZbDRqjcjgSrbnrifHsfsttza7zcvRAsL7mMV6xWcyhwQy7Xj5v4hhbr6b+iDYwlmQ==", | ||||
|             "dev": true, | ||||
|             "license": "MIT" | ||||
|         }, | ||||
| @@ -9972,9 +9973,9 @@ | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/rollup": { | ||||
|             "version": "4.40.1", | ||||
|             "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.40.1.tgz", | ||||
|             "integrity": "sha512-C5VvvgCCyfyotVITIAv+4efVytl5F7wt+/I2i9q9GZcEXW9BP52YYOXC58igUi+LFZVHukErIIqQSWwv/M3WRw==", | ||||
|             "version": "4.40.2", | ||||
|             "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.40.2.tgz", | ||||
|             "integrity": "sha512-tfUOg6DTP4rhQ3VjOO6B4wyrJnGOX85requAXvqYTHsOgb2TFJdZ3aWpT8W2kPoypSGP7dZUyzxJ9ee4buM5Fg==", | ||||
|             "dev": true, | ||||
|             "license": "MIT", | ||||
|             "dependencies": { | ||||
| @@ -9988,26 +9989,26 @@ | ||||
|                 "npm": ">=8.0.0" | ||||
|             }, | ||||
|             "optionalDependencies": { | ||||
|                 "@rollup/rollup-android-arm-eabi": "4.40.1", | ||||
|                 "@rollup/rollup-android-arm64": "4.40.1", | ||||
|                 "@rollup/rollup-darwin-arm64": "4.40.1", | ||||
|                 "@rollup/rollup-darwin-x64": "4.40.1", | ||||
|                 "@rollup/rollup-freebsd-arm64": "4.40.1", | ||||
|                 "@rollup/rollup-freebsd-x64": "4.40.1", | ||||
|                 "@rollup/rollup-linux-arm-gnueabihf": "4.40.1", | ||||
|                 "@rollup/rollup-linux-arm-musleabihf": "4.40.1", | ||||
|                 "@rollup/rollup-linux-arm64-gnu": "4.40.1", | ||||
|                 "@rollup/rollup-linux-arm64-musl": "4.40.1", | ||||
|                 "@rollup/rollup-linux-loongarch64-gnu": "4.40.1", | ||||
|                 "@rollup/rollup-linux-powerpc64le-gnu": "4.40.1", | ||||
|                 "@rollup/rollup-linux-riscv64-gnu": "4.40.1", | ||||
|                 "@rollup/rollup-linux-riscv64-musl": "4.40.1", | ||||
|                 "@rollup/rollup-linux-s390x-gnu": "4.40.1", | ||||
|                 "@rollup/rollup-linux-x64-gnu": "4.40.1", | ||||
|                 "@rollup/rollup-linux-x64-musl": "4.40.1", | ||||
|                 "@rollup/rollup-win32-arm64-msvc": "4.40.1", | ||||
|                 "@rollup/rollup-win32-ia32-msvc": "4.40.1", | ||||
|                 "@rollup/rollup-win32-x64-msvc": "4.40.1", | ||||
|                 "@rollup/rollup-android-arm-eabi": "4.40.2", | ||||
|                 "@rollup/rollup-android-arm64": "4.40.2", | ||||
|                 "@rollup/rollup-darwin-arm64": "4.40.2", | ||||
|                 "@rollup/rollup-darwin-x64": "4.40.2", | ||||
|                 "@rollup/rollup-freebsd-arm64": "4.40.2", | ||||
|                 "@rollup/rollup-freebsd-x64": "4.40.2", | ||||
|                 "@rollup/rollup-linux-arm-gnueabihf": "4.40.2", | ||||
|                 "@rollup/rollup-linux-arm-musleabihf": "4.40.2", | ||||
|                 "@rollup/rollup-linux-arm64-gnu": "4.40.2", | ||||
|                 "@rollup/rollup-linux-arm64-musl": "4.40.2", | ||||
|                 "@rollup/rollup-linux-loongarch64-gnu": "4.40.2", | ||||
|                 "@rollup/rollup-linux-powerpc64le-gnu": "4.40.2", | ||||
|                 "@rollup/rollup-linux-riscv64-gnu": "4.40.2", | ||||
|                 "@rollup/rollup-linux-riscv64-musl": "4.40.2", | ||||
|                 "@rollup/rollup-linux-s390x-gnu": "4.40.2", | ||||
|                 "@rollup/rollup-linux-x64-gnu": "4.40.2", | ||||
|                 "@rollup/rollup-linux-x64-musl": "4.40.2", | ||||
|                 "@rollup/rollup-win32-arm64-msvc": "4.40.2", | ||||
|                 "@rollup/rollup-win32-ia32-msvc": "4.40.2", | ||||
|                 "@rollup/rollup-win32-x64-msvc": "4.40.2", | ||||
|                 "fsevents": "~2.3.2" | ||||
|             } | ||||
|         }, | ||||
| @@ -10063,9 +10064,9 @@ | ||||
|             "license": "MIT" | ||||
|         }, | ||||
|         "node_modules/sass": { | ||||
|             "version": "1.87.0", | ||||
|             "resolved": "https://registry.npmjs.org/sass/-/sass-1.87.0.tgz", | ||||
|             "integrity": "sha512-d0NoFH4v6SjEK7BoX810Jsrhj7IQSYHAHLi/iSpgqKc7LaIDshFRlSg5LOymf9FqQhxEHs2W5ZQXlvy0KD45Uw==", | ||||
|             "version": "1.88.0", | ||||
|             "resolved": "https://registry.npmjs.org/sass/-/sass-1.88.0.tgz", | ||||
|             "integrity": "sha512-sF6TWQqjFvr4JILXzG4ucGOLELkESHL+I5QJhh7CNaE+Yge0SI+ehCatsXhJ7ymU1hAFcIS3/PBpjdIbXoyVbg==", | ||||
|             "dev": true, | ||||
|             "license": "MIT", | ||||
|             "dependencies": { | ||||
| @@ -11329,9 +11330,9 @@ | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/vite": { | ||||
|             "version": "6.3.4", | ||||
|             "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.4.tgz", | ||||
|             "integrity": "sha512-BiReIiMS2fyFqbqNT/Qqt4CVITDU9M9vE+DKcVAsB+ZV0wvTKd+3hMbkpxz1b+NmEDMegpVbisKiAZOnvO92Sw==", | ||||
|             "version": "6.3.5", | ||||
|             "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", | ||||
|             "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", | ||||
|             "dev": true, | ||||
|             "license": "MIT", | ||||
|             "dependencies": { | ||||
| @@ -11649,9 +11650,9 @@ | ||||
|             "license": "BSD-2-Clause" | ||||
|         }, | ||||
|         "node_modules/webpack": { | ||||
|             "version": "5.99.7", | ||||
|             "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.99.7.tgz", | ||||
|             "integrity": "sha512-CNqKBRMQjwcmKR0idID5va1qlhrqVUKpovi+Ec79ksW8ux7iS1+A6VqzfZXgVYCFRKl7XL5ap3ZoMpwBJxcg0w==", | ||||
|             "version": "5.99.8", | ||||
|             "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.99.8.tgz", | ||||
|             "integrity": "sha512-lQ3CPiSTpfOnrEGeXDwoq5hIGzSjmwD72GdfVzF7CQAI7t47rJG9eDWvcEkEn3CUQymAElVvDg3YNTlCYj+qUQ==", | ||||
|             "dev": true, | ||||
|             "license": "MIT", | ||||
|             "dependencies": { | ||||
|   | ||||
| @@ -154,7 +154,7 @@ | ||||
|         "url": "URL", | ||||
|         "active": "H\u00e0nh \u0111\u1ed9ng", | ||||
|         "interest_date": "Ng\u00e0y l\u00e3i", | ||||
|         "administration_currency": "Native currency", | ||||
|         "administration_currency": "Ti\u1ec1n t\u1ec7 b\u1ea3n \u0111\u1ecba", | ||||
|         "title": "Ti\u00eau \u0111\u1ec1", | ||||
|         "date": "Ng\u00e0y", | ||||
|         "book_date": "Ng\u00e0y \u0111\u1eb7t s\u00e1ch", | ||||
| @@ -169,7 +169,7 @@ | ||||
|         "webhook_delivery": "Ph\u00e2n ph\u1ed1i", | ||||
|         "from_currency_to_currency": "{from} → {to}", | ||||
|         "to_currency_from_currency": "{to} → {from}", | ||||
|         "rate": "Rate" | ||||
|         "rate": "T\u1ef7 l\u1ec7" | ||||
|     }, | ||||
|     "list": { | ||||
|         "title": "Ti\u00eau \u0111\u1ec1", | ||||
|   | ||||
		Reference in New Issue
	
	Block a user