From a6eebae613a450d24eff7fe689e7fb65e6b647b0 Mon Sep 17 00:00:00 2001 From: gongfuxiang Date: Mon, 14 Mar 2022 17:02:07 +0800 Subject: [PATCH] =?UTF-8?q?=E7=B1=BB=E5=BA=93=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vendor/composer/autoload_classmap.php | 1 + vendor/composer/autoload_psr4.php | 2 +- vendor/composer/autoload_static.php | 7 +- vendor/composer/installed.json | 100 +- vendor/composer/installed.php | 36 +- .../phpspreadsheet/.php-cs-fixer.dist.php | 2 +- vendor/phpoffice/phpspreadsheet/CHANGELOG.md | 90 + vendor/phpoffice/phpspreadsheet/composer.json | 7 +- .../phpspreadsheet/phpstan-baseline.neon | 2808 +---------------- .../phpspreadsheet/phpstan-conditional.php | 2 +- .../phpspreadsheet/phpstan.neon.dist | 2 +- .../Calculation/ArrayEnabled.php | 56 + .../Calculation/BinaryComparison.php | 181 ++ .../Calculation/Calculation.php | 173 +- .../PhpSpreadsheet/Calculation/DateTime.php | 38 +- .../Calculation/DateTimeExcel/Date.php | 20 +- .../Calculation/DateTimeExcel/DateParts.php | 30 +- .../Calculation/DateTimeExcel/DateValue.php | 14 +- .../Calculation/DateTimeExcel/Days.php | 21 +- .../Calculation/DateTimeExcel/Days360.php | 20 +- .../Calculation/DateTimeExcel/Difference.php | 18 +- .../Calculation/DateTimeExcel/Month.php | 27 +- .../Calculation/DateTimeExcel/NetworkDays.php | 21 +- .../Calculation/DateTimeExcel/Time.php | 20 +- .../Calculation/DateTimeExcel/TimeParts.php | 34 +- .../Calculation/DateTimeExcel/TimeValue.php | 14 +- .../Calculation/DateTimeExcel/Week.php | 40 +- .../Calculation/DateTimeExcel/WorkDay.php | 42 +- .../Calculation/DateTimeExcel/YearFrac.php | 26 +- .../Engine/ArrayArgumentHelper.php | 202 ++ .../Engine/ArrayArgumentProcessor.php | 174 + .../Calculation/Engineering.php | 122 +- .../Calculation/Engineering/BesselI.php | 14 +- .../Calculation/Engineering/BesselJ.php | 14 +- .../Calculation/Engineering/BesselK.php | 14 +- .../Calculation/Engineering/BesselY.php | 14 +- .../Calculation/Engineering/BitWise.php | 84 +- .../Calculation/Engineering/Compare.php | 40 +- .../Calculation/Engineering/Complex.php | 42 +- .../Engineering/ComplexFunctions.php | 218 +- .../Engineering/ComplexOperations.php | 33 +- .../Calculation/Engineering/ConvertBase.php | 5 +- .../Calculation/Engineering/ConvertBinary.php | 55 +- .../Engineering/ConvertDecimal.php | 60 +- .../Calculation/Engineering/ConvertHex.php | 55 +- .../Calculation/Engineering/ConvertOctal.php | 57 +- .../Calculation/Engineering/ConvertUOM.php | 23 +- .../Calculation/Engineering/Erf.php | 23 +- .../Calculation/Engineering/ErfC.php | 14 +- .../PhpSpreadsheet/Calculation/Financial.php | 12 +- .../Calculation/Financial/Amortization.php | 2 +- .../CashFlow/Variable/NonPeriodic.php | 34 +- .../Calculation/Financial/Coupons.php | 4 +- .../Calculation/Financial/Dollar.php | 64 +- .../Financial/Securities/AccruedInterest.php | 6 +- .../Financial/Securities/Price.php | 10 +- .../Financial/Securities/Rates.php | 4 +- .../Financial/Securities/Yields.php | 8 +- .../Calculation/Financial/TreasuryBill.php | 6 +- .../PhpSpreadsheet/Calculation/Functions.php | 18 + .../PhpSpreadsheet/Calculation/Logical.php | 2 +- .../Calculation/Logical/Conditional.php | 36 +- .../Calculation/Logical/Operations.php | 12 +- .../PhpSpreadsheet/Calculation/MathTrig.php | 196 +- .../Calculation/MathTrig/Absolute.php | 13 +- .../Calculation/MathTrig/Angle.php | 23 +- .../Calculation/MathTrig/Arabic.php | 15 +- .../Calculation/MathTrig/Base.php | 23 +- .../Calculation/MathTrig/Ceiling.php | 42 +- .../Calculation/MathTrig/Combinations.php | 35 +- .../Calculation/MathTrig/Exp.php | 13 +- .../Calculation/MathTrig/Factorial.php | 23 +- .../Calculation/MathTrig/Floor.php | 38 +- .../Calculation/MathTrig/IntClass.php | 13 +- .../Calculation/MathTrig/Logarithms.php | 31 +- .../Calculation/MathTrig/MatrixFunctions.php | 43 +- .../Calculation/MathTrig/Operations.php | 37 +- .../Calculation/MathTrig/Random.php | 62 +- .../Calculation/MathTrig/Roman.php | 13 +- .../Calculation/MathTrig/Round.php | 71 +- .../Calculation/MathTrig/SeriesSum.php | 9 +- .../Calculation/MathTrig/Sign.php | 13 +- .../Calculation/MathTrig/Sqrt.php | 23 +- .../Calculation/MathTrig/Subtotal.php | 27 +- .../Calculation/MathTrig/Trig/Cosecant.php | 23 +- .../Calculation/MathTrig/Trig/Cosine.php | 43 +- .../Calculation/MathTrig/Trig/Cotangent.php | 43 +- .../Calculation/MathTrig/Trig/Secant.php | 23 +- .../Calculation/MathTrig/Trig/Sine.php | 43 +- .../Calculation/MathTrig/Trig/Tangent.php | 56 +- .../Calculation/MathTrig/Trunc.php | 17 +- .../Calculation/Statistical.php | 66 +- .../Calculation/Statistical/Averages.php | 2 +- .../Calculation/Statistical/Confidence.php | 18 +- .../Statistical/Distributions/Beta.php | 43 +- .../Statistical/Distributions/Binomial.php | 62 +- .../Statistical/Distributions/ChiSquared.php | 51 +- .../Statistical/Distributions/Exponential.php | 16 +- .../Statistical/Distributions/F.php | 18 +- .../Statistical/Distributions/Fisher.php | 21 +- .../Statistical/Distributions/Gamma.php | 48 +- .../Distributions/HyperGeometric.php | 27 +- .../Statistical/Distributions/LogNormal.php | 44 +- .../Statistical/Distributions/Normal.php | 30 +- .../Statistical/Distributions/Poisson.php | 15 +- .../Distributions/StandardNormal.php | 49 +- .../Statistical/Distributions/StudentT.php | 27 +- .../Statistical/Distributions/Weibull.php | 18 +- .../Calculation/Statistical/Permutations.php | 25 +- .../Calculation/Statistical/Standardize.php | 22 +- .../Calculation/Statistical/Trends.php | 12 +- .../PhpSpreadsheet/Calculation/TextData.php | 90 +- .../Calculation/TextData/CaseConvert.php | 40 +- .../Calculation/TextData/CharacterConvert.php | 23 +- .../Calculation/TextData/Concatenate.php | 42 +- .../Calculation/TextData/Extract.php | 40 +- .../Calculation/TextData/Format.php | 69 +- .../Calculation/TextData/Helpers.php | 4 - .../Calculation/TextData/Replace.php | 42 +- .../Calculation/TextData/Search.php | 25 +- .../Calculation/TextData/Text.php | 36 +- .../Calculation/TextData/Trim.php | 22 +- .../Calculation/locale/Translations.xlsx | Bin 109827 -> 110082 bytes .../Calculation/locale/ru/functions | 21 +- .../src/PhpSpreadsheet/Cell/Cell.php | 41 +- .../src/PhpSpreadsheet/Cell/DataType.php | 1 + .../src/PhpSpreadsheet/Reader/Xls.php | 13 + .../src/PhpSpreadsheet/Reader/Xlsx.php | 69 +- .../PhpSpreadsheet/Reader/Xlsx/AutoFilter.php | 2 +- .../Reader/Xlsx/ConditionalStyles.php | 124 +- .../PhpSpreadsheet/Reader/Xlsx/Namespaces.php | 2 + .../src/PhpSpreadsheet/Reader/Xlsx/Styles.php | 224 +- .../src/PhpSpreadsheet/ReferenceHelper.php | 20 + .../src/PhpSpreadsheet/Shared/Date.php | 2 +- .../Shared/JAMA/EigenvalueDecomposition.php | 4 +- .../PhpSpreadsheet/Shared/OLE/PPS/Root.php | 8 +- .../PhpSpreadsheet/Shared/StringHelper.php | 2 +- .../src/PhpSpreadsheet/Shared/Trend/Trend.php | 1 + .../src/PhpSpreadsheet/Spreadsheet.php | 4 +- .../src/PhpSpreadsheet/Style/Color.php | 58 +- .../src/PhpSpreadsheet/Style/Conditional.php | 31 +- .../ConditionalFormatting/CellMatcher.php | 312 ++ .../CellStyleAssessor.php | 45 + .../ConditionalFormatting/StyleMerger.php | 118 + .../Style/ConditionalFormatting/Wizard.php | 95 + .../ConditionalFormatting/Wizard/Blanks.php | 99 + .../Wizard/CellValue.php | 189 ++ .../Wizard/DateValue.php | 111 + .../Wizard/Duplicates.php | 78 + .../ConditionalFormatting/Wizard/Errors.php | 95 + .../Wizard/Expression.php | 73 + .../Wizard/TextValue.php | 163 + .../Wizard/WizardAbstract.php | 197 ++ .../Wizard/WizardInterface.php | 25 + .../src/PhpSpreadsheet/Style/NumberFormat.php | 2 + .../Style/NumberFormat/DateFormatter.php | 10 +- .../NumberFormat/PercentageFormatter.php | 5 +- .../src/PhpSpreadsheet/Style/Style.php | 4 +- .../Worksheet/ColumnDimension.php | 23 +- .../PhpSpreadsheet/Worksheet/Dimension.php | 15 - .../PhpSpreadsheet/Worksheet/Worksheet.php | 142 +- .../PhpSpreadsheet/Writer/Xls/Worksheet.php | 1 + .../PhpSpreadsheet/Writer/Xlsx/Worksheet.php | 168 +- vendor/services.php | 2 +- vendor/symfony/polyfill-php80/Php80.php | 12 +- vendor/symfony/polyfill-php80/PhpToken.php | 103 + .../Resources/stubs/PhpToken.php | 7 + .../var-dumper/Caster/MysqliCaster.php | 33 + .../var-dumper/Cloner/AbstractCloner.php | 2 + .../symfony/var-dumper/Dumper/HtmlDumper.php | 2 +- vendor/symfony/var-dumper/LICENSE | 2 +- vendor/topthink/think-orm/src/db/Raw.php | 4 - 172 files changed, 6073 insertions(+), 4082 deletions(-) create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/ArrayEnabled.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/BinaryComparison.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engine/ArrayArgumentHelper.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engine/ArrayArgumentProcessor.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/CellMatcher.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/CellStyleAssessor.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/StyleMerger.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/Wizard.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/Blanks.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/CellValue.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/DateValue.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/Duplicates.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/Errors.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/Expression.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/TextValue.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/WizardAbstract.php create mode 100644 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/WizardInterface.php create mode 100644 vendor/symfony/polyfill-php80/PhpToken.php create mode 100644 vendor/symfony/polyfill-php80/Resources/stubs/PhpToken.php create mode 100644 vendor/symfony/var-dumper/Caster/MysqliCaster.php diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php index 4ebd53fca..dc15c4871 100644 --- a/vendor/composer/autoload_classmap.php +++ b/vendor/composer/autoload_classmap.php @@ -8,6 +8,7 @@ $baseDir = dirname($vendorDir); return array( 'Attribute' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Attribute.php', 'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php', + 'PhpToken' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php', 'Stringable' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Stringable.php', 'UnhandledMatchError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php', 'ValueError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/ValueError.php', diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php index 9edf7e966..b5c204828 100644 --- a/vendor/composer/autoload_psr4.php +++ b/vendor/composer/autoload_psr4.php @@ -9,7 +9,7 @@ return array( 'think\\view\\driver\\' => array($vendorDir . '/topthink/think-view/src'), 'think\\trace\\' => array($vendorDir . '/topthink/think-trace/src'), 'think\\app\\' => array($vendorDir . '/topthink/think-multi-app/src'), - 'think\\' => array($vendorDir . '/topthink/think-helper/src', $vendorDir . '/topthink/think-template/src', $vendorDir . '/topthink/think-orm/src', $vendorDir . '/topthink/framework/src/think'), + 'think\\' => array($vendorDir . '/topthink/framework/src/think', $vendorDir . '/topthink/think-helper/src', $vendorDir . '/topthink/think-orm/src', $vendorDir . '/topthink/think-template/src'), 'app\\' => array($baseDir . '/app'), 'ZipStream\\' => array($vendorDir . '/maennchen/zipstream-php/src'), 'Symfony\\Polyfill\\Php80\\' => array($vendorDir . '/symfony/polyfill-php80'), diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php index 9170ac6ba..53870b17f 100644 --- a/vendor/composer/autoload_static.php +++ b/vendor/composer/autoload_static.php @@ -81,10 +81,10 @@ class ComposerStaticInit1ed187777399b73a018d9a6af63a57d1 ), 'think\\' => array ( - 0 => __DIR__ . '/..' . '/topthink/think-helper/src', - 1 => __DIR__ . '/..' . '/topthink/think-template/src', + 0 => __DIR__ . '/..' . '/topthink/framework/src/think', + 1 => __DIR__ . '/..' . '/topthink/think-helper/src', 2 => __DIR__ . '/..' . '/topthink/think-orm/src', - 3 => __DIR__ . '/..' . '/topthink/framework/src/think', + 3 => __DIR__ . '/..' . '/topthink/think-template/src', ), 'app\\' => array ( @@ -182,6 +182,7 @@ class ComposerStaticInit1ed187777399b73a018d9a6af63a57d1 public static $classMap = array ( 'Attribute' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Attribute.php', 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', + 'PhpToken' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php', 'Stringable' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Stringable.php', 'UnhandledMatchError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php', 'ValueError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/ValueError.php', diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json index 6a2cbb377..7a87c02b4 100644 --- a/vendor/composer/installed.json +++ b/vendor/composer/installed.json @@ -558,17 +558,17 @@ }, { "name": "phpoffice/phpspreadsheet", - "version": "1.21.0", - "version_normalized": "1.21.0.0", + "version": "1.22.0", + "version_normalized": "1.22.0.0", "source": { "type": "git", "url": "https://github.com/PHPOffice/PhpSpreadsheet.git", - "reference": "1a359d2ccbb89c05f5dffb32711a95f4afc67964" + "reference": "3a9e29b4f386a08a151a33578e80ef1747037a48" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/1a359d2ccbb89c05f5dffb32711a95f4afc67964", - "reference": "1a359d2ccbb89c05f5dffb32711a95f4afc67964", + "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/3a9e29b4f386a08a151a33578e80ef1747037a48", + "reference": "3a9e29b4f386a08a151a33578e80ef1747037a48", "shasum": "", "mirrors": [ { @@ -605,7 +605,7 @@ "dompdf/dompdf": "^1.0", "friendsofphp/php-cs-fixer": "^3.2", "jpgraph/jpgraph": "^4.0", - "mpdf/mpdf": "^8.0", + "mpdf/mpdf": "8.0.17", "phpcompatibility/php-compatibility": "^9.3", "phpstan/phpstan": "^1.1", "phpstan/phpstan-phpunit": "^1.0", @@ -619,7 +619,7 @@ "mpdf/mpdf": "Option for rendering PDF with PDF Writer", "tecnickcom/tcpdf": "Option for rendering PDF with PDF Writer (doesn't yet support PHP8)" }, - "time": "2022-01-06T11:10:08+00:00", + "time": "2022-02-18T12:57:07+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -665,7 +665,7 @@ ], "support": { "issues": "https://github.com/PHPOffice/PhpSpreadsheet/issues", - "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/1.21.0" + "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/1.22.0" }, "install-path": "../phpoffice/phpspreadsheet" }, @@ -1074,8 +1074,8 @@ }, { "name": "symfony/polyfill-mbstring", - "version": "v1.24.0", - "version_normalized": "1.24.0.0", + "version": "v1.25.0", + "version_normalized": "1.25.0.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", @@ -1115,12 +1115,12 @@ }, "installation-source": "dist", "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - }, "files": [ "bootstrap.php" - ] + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1146,7 +1146,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.24.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.25.0" }, "funding": [ { @@ -1166,8 +1166,8 @@ }, { "name": "symfony/polyfill-php72", - "version": "v1.24.0", - "version_normalized": "1.24.0.0", + "version": "v1.25.0", + "version_normalized": "1.25.0.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", @@ -1201,12 +1201,12 @@ }, "installation-source": "dist", "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php72\\": "" - }, "files": [ "bootstrap.php" - ] + ], + "psr-4": { + "Symfony\\Polyfill\\Php72\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1231,7 +1231,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.24.0" + "source": "https://github.com/symfony/polyfill-php72/tree/v1.25.0" }, "funding": [ { @@ -1251,17 +1251,17 @@ }, { "name": "symfony/polyfill-php80", - "version": "v1.24.0", - "version_normalized": "1.24.0.0", + "version": "v1.25.0", + "version_normalized": "1.25.0.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "57b712b08eddb97c762a8caa32c84e037892d2e9" + "reference": "4407588e0d3f1f52efb65fbe92babe41f37fe50c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/57b712b08eddb97c762a8caa32c84e037892d2e9", - "reference": "57b712b08eddb97c762a8caa32c84e037892d2e9", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/4407588e0d3f1f52efb65fbe92babe41f37fe50c", + "reference": "4407588e0d3f1f52efb65fbe92babe41f37fe50c", "shasum": "", "mirrors": [ { @@ -1273,7 +1273,7 @@ "require": { "php": ">=7.1" }, - "time": "2021-09-13T13:58:33+00:00", + "time": "2022-03-04T08:16:47+00:00", "type": "library", "extra": { "branch-alias": { @@ -1286,12 +1286,12 @@ }, "installation-source": "dist", "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" - }, "files": [ "bootstrap.php" ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, "classmap": [ "Resources/stubs" ] @@ -1323,7 +1323,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.24.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.25.0" }, "funding": [ { @@ -1343,17 +1343,17 @@ }, { "name": "symfony/var-dumper", - "version": "v4.4.36", - "version_normalized": "4.4.36.0", + "version": "v4.4.39", + "version_normalized": "4.4.39.0", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "02685c62fcbc4262235cc72a54fbd45ab719ce3c" + "reference": "35237c5e5dcb6593a46a860ba5b29c1d4683d80e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/02685c62fcbc4262235cc72a54fbd45ab719ce3c", - "reference": "02685c62fcbc4262235cc72a54fbd45ab719ce3c", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/35237c5e5dcb6593a46a860ba5b29c1d4683d80e", + "reference": "35237c5e5dcb6593a46a860ba5b29c1d4683d80e", "shasum": "", "mirrors": [ { @@ -1383,7 +1383,7 @@ "ext-intl": "To show region name in time zone dump", "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" }, - "time": "2021-12-29T09:28:53+00:00", + "time": "2022-02-25T10:38:15+00:00", "bin": [ "Resources/bin/var-dump-server" ], @@ -1421,7 +1421,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v4.4.36" + "source": "https://github.com/symfony/var-dumper/tree/v4.4.39" }, "funding": [ { @@ -1623,17 +1623,17 @@ }, { "name": "topthink/think-orm", - "version": "v2.0.51", - "version_normalized": "2.0.51.0", + "version": "v2.0.52", + "version_normalized": "2.0.52.0", "source": { "type": "git", "url": "https://github.com/top-think/think-orm.git", - "reference": "149d266acdc4b2f07c6a94f1733b6b97d340e0e2" + "reference": "407a60658f37fc57422ab95a9922c6f69af90f46" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/top-think/think-orm/zipball/149d266acdc4b2f07c6a94f1733b6b97d340e0e2", - "reference": "149d266acdc4b2f07c6a94f1733b6b97d340e0e2", + "url": "https://api.github.com/repos/top-think/think-orm/zipball/407a60658f37fc57422ab95a9922c6f69af90f46", + "reference": "407a60658f37fc57422ab95a9922c6f69af90f46", "shasum": "", "mirrors": [ { @@ -1653,16 +1653,16 @@ "require-dev": { "phpunit/phpunit": "^7|^8|^9.5" }, - "time": "2022-01-21T06:25:25+00:00", + "time": "2022-01-25T06:00:05+00:00", "type": "library", "installation-source": "dist", "autoload": { - "psr-4": { - "think\\": "src" - }, "files": [ "stubs/load_stubs.php" - ] + ], + "psr-4": { + "think\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1681,7 +1681,7 @@ ], "support": { "issues": "https://github.com/top-think/think-orm/issues", - "source": "https://github.com/top-think/think-orm/tree/v2.0.51" + "source": "https://github.com/top-think/think-orm/tree/v2.0.52" }, "install-path": "../topthink/think-orm" }, diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php index 76ed4be63..ac3ff25c9 100644 --- a/vendor/composer/installed.php +++ b/vendor/composer/installed.php @@ -5,7 +5,7 @@ 'type' => 'project', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), - 'reference' => '921d28f9ce7fcc47b9b8312f92080643eddfe75a', + 'reference' => 'c75c0b6802d97c28dd0256593f3df9c71a6b5a5f', 'name' => 'shopxo/shopxo', 'dev' => true, ), @@ -83,12 +83,12 @@ 'dev_requirement' => false, ), 'phpoffice/phpspreadsheet' => array( - 'pretty_version' => '1.21.0', - 'version' => '1.21.0.0', + 'pretty_version' => '1.22.0', + 'version' => '1.22.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../phpoffice/phpspreadsheet', 'aliases' => array(), - 'reference' => '1a359d2ccbb89c05f5dffb32711a95f4afc67964', + 'reference' => '3a9e29b4f386a08a151a33578e80ef1747037a48', 'dev_requirement' => false, ), 'psr/cache' => array( @@ -160,12 +160,12 @@ 'type' => 'project', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), - 'reference' => '921d28f9ce7fcc47b9b8312f92080643eddfe75a', + 'reference' => 'c75c0b6802d97c28dd0256593f3df9c71a6b5a5f', 'dev_requirement' => false, ), 'symfony/polyfill-mbstring' => array( - 'pretty_version' => 'v1.24.0', - 'version' => '1.24.0.0', + 'pretty_version' => 'v1.25.0', + 'version' => '1.25.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-mbstring', 'aliases' => array(), @@ -173,8 +173,8 @@ 'dev_requirement' => false, ), 'symfony/polyfill-php72' => array( - 'pretty_version' => 'v1.24.0', - 'version' => '1.24.0.0', + 'pretty_version' => 'v1.25.0', + 'version' => '1.25.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-php72', 'aliases' => array(), @@ -182,21 +182,21 @@ 'dev_requirement' => true, ), 'symfony/polyfill-php80' => array( - 'pretty_version' => 'v1.24.0', - 'version' => '1.24.0.0', + 'pretty_version' => 'v1.25.0', + 'version' => '1.25.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-php80', 'aliases' => array(), - 'reference' => '57b712b08eddb97c762a8caa32c84e037892d2e9', + 'reference' => '4407588e0d3f1f52efb65fbe92babe41f37fe50c', 'dev_requirement' => true, ), 'symfony/var-dumper' => array( - 'pretty_version' => 'v4.4.36', - 'version' => '4.4.36.0', + 'pretty_version' => 'v4.4.39', + 'version' => '4.4.39.0', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/var-dumper', 'aliases' => array(), - 'reference' => '02685c62fcbc4262235cc72a54fbd45ab719ce3c', + 'reference' => '35237c5e5dcb6593a46a860ba5b29c1d4683d80e', 'dev_requirement' => true, ), 'topthink/framework' => array( @@ -227,12 +227,12 @@ 'dev_requirement' => false, ), 'topthink/think-orm' => array( - 'pretty_version' => 'v2.0.51', - 'version' => '2.0.51.0', + 'pretty_version' => 'v2.0.52', + 'version' => '2.0.52.0', 'type' => 'library', 'install_path' => __DIR__ . '/../topthink/think-orm', 'aliases' => array(), - 'reference' => '149d266acdc4b2f07c6a94f1733b6b97d340e0e2', + 'reference' => '407a60658f37fc57422ab95a9922c6f69af90f46', 'dev_requirement' => false, ), 'topthink/think-template' => array( diff --git a/vendor/phpoffice/phpspreadsheet/.php-cs-fixer.dist.php b/vendor/phpoffice/phpspreadsheet/.php-cs-fixer.dist.php index c0e8f9d53..a393043d7 100644 --- a/vendor/phpoffice/phpspreadsheet/.php-cs-fixer.dist.php +++ b/vendor/phpoffice/phpspreadsheet/.php-cs-fixer.dist.php @@ -55,7 +55,7 @@ $config 'function_declaration' => true, 'function_to_constant' => true, 'function_typehint_space' => true, - 'general_phpdoc_annotation_remove' => ['annotations' => ['access', 'category', 'copyright', 'method', 'throws']], + 'general_phpdoc_annotation_remove' => ['annotations' => ['access', 'category', 'copyright', 'throws']], 'global_namespace_import' => true, 'header_comment' => false, // We don't use common header in all our files 'heredoc_indentation' => false, // Requires PHP >= 7.3 diff --git a/vendor/phpoffice/phpspreadsheet/CHANGELOG.md b/vendor/phpoffice/phpspreadsheet/CHANGELOG.md index 3bfc215a0..82db8d92e 100644 --- a/vendor/phpoffice/phpspreadsheet/CHANGELOG.md +++ b/vendor/phpoffice/phpspreadsheet/CHANGELOG.md @@ -5,6 +5,96 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com) and this project adheres to [Semantic Versioning](https://semver.org). +## 1.22.0 - 2022-02-18 + +### Added + +- Namespacing phase 2 - styles. +[PR #2471](https://github.com/PHPOffice/PhpSpreadsheet/pull/2471) + +- Improved support for passing of array arguments to Excel function implementations to return array results (where appropriate). [Issue #2551](https://github.com/PHPOffice/PhpSpreadsheet/issues/2551) + + This is the first stage in an ongoing process of adding array support to all appropriate function implementations, +- Support for the Excel365 Math/Trig SEQUENCE() function [PR #2536](https://github.com/PHPOffice/PhpSpreadsheet/pull/2536) +- Support for the Excel365 Math/Trig RANDARRAY() function [PR #2540](https://github.com/PHPOffice/PhpSpreadsheet/pull/2540) + + Note that the Spill Operator is not yet supported in the Calculation Engine; but this can still be useful for defining array constants. +- Improved support for Conditional Formatting Rules [PR #2491](https://github.com/PHPOffice/PhpSpreadsheet/pull/2491) + - Provide support for a wider range of Conditional Formatting Rules for Xlsx Reader/Writer: + - Cells Containing (cellIs) + - Specific Text (containing, notContaining, beginsWith, endsWith) + - Dates Occurring (all supported timePeriods) + - Blanks/NoBlanks + - Errors/NoErrors + - Duplicates/Unique + - Expression + - Provision of CF Wizards (for all the above listed rule types) to help create/modify CF Rules without having to manage all the combinations of types/operators, and the complexities of formula expressions, or the text/timePeriod attributes. + + See [documentation](https://phpspreadsheet.readthedocs.io/en/latest/topics/conditional-formatting/) for details + + - Full support of the above CF Rules for the Xlsx Reader and Writer; even when the file being loaded has CF rules listed in the `` element for the worksheet rather than the `` element. + - Provision of a CellMatcher to identify if rules are matched for a cell, and which matching style will be applied. + - Improved documentation and examples, covering all supported CF rule types. +- Add support for one digit decimals (FORMAT_NUMBER_0, FORMAT_PERCENTAGE_0). [PR #2525](https://github.com/PHPOffice/PhpSpreadsheet/pull/2525) +- Initial work enabling Excel function implementations for handling arrays as arguments when used in "array formulae" [#2562](https://github.com/PHPOffice/PhpSpreadsheet/issues/2562) +- Enable most of the Date/Time functions to accept array arguments [#2573](https://github.com/PHPOffice/PhpSpreadsheet/issues/2573) +- Array ready functions - Text, Math/Trig, Statistical, Engineering and Logical [#2580](https://github.com/PHPOffice/PhpSpreadsheet/issues/2580) + +### Changed + +- Additional Russian translations for Excel Functions (courtesy of aleks-samurai). +- Improved code coverage for NumberFormat. [PR #2556](https://github.com/PHPOffice/PhpSpreadsheet/pull/2556) +- Extract some methods from the Calculation Engine into dedicated classes [#2537](https://github.com/PHPOffice/PhpSpreadsheet/issues/2537) +- Eliminate calls to `flattenSingleValue()` that are no longer required when we're checking for array values as arguments [#2590](https://github.com/PHPOffice/PhpSpreadsheet/issues/2590) + +### Deprecated + +- Nothing + +### Removed + +- Nothing + +### Fixed + +- Fixed `ReferenceHelper@insertNewBefore` behavior when removing column before last column with null value +[PR #2541](https://github.com/PHPOffice/PhpSpreadsheet/pull/2541) +- Fix bug with `DOLLARDE()` and `DOLLARFR()` functions when the dollar value is negative [Issue #2578](https://github.com/PHPOffice/PhpSpreadsheet/issues/2578) [PR #2579](https://github.com/PHPOffice/PhpSpreadsheet/pull/2579) +- Fix partial function name matching when translating formulae from Russian to English [Issue #2533](https://github.com/PHPOffice/PhpSpreadsheet/issues/2533) [PR #2534](https://github.com/PHPOffice/PhpSpreadsheet/pull/2534) +- Various bugs related to Conditional Formatting Rules, and errors in the Xlsx Writer for Conditional Formatting [PR #2491](https://github.com/PHPOffice/PhpSpreadsheet/pull/2491) +- Xlsx Reader merge range fixes. +[Issue #2501](https://github.com/PHPOffice/PhpSpreadsheet/issues/2501) +[PR #2504](https://github.com/PHPOffice/PhpSpreadsheet/pull/2504) +- Handle explicit "date" type for Cell in Xlsx Reader. +[Issue #2373](https://github.com/PHPOffice/PhpSpreadsheet/issues/2373) +[PR #2485](https://github.com/PHPOffice/PhpSpreadsheet/pull/2485) +- Recalibrate Row/Column Dimensions after removeRow/Column. +[Issue #2442](https://github.com/PHPOffice/PhpSpreadsheet/issues/2442) +[PR #2486](https://github.com/PHPOffice/PhpSpreadsheet/pull/2486) +- Refinement for XIRR. +[Issue #2469](https://github.com/PHPOffice/PhpSpreadsheet/issues/2469) +[PR #2487](https://github.com/PHPOffice/PhpSpreadsheet/pull/2487) +- Xlsx Reader handle cell with non-null explicit type but null value. +[Issue #2488](https://github.com/PHPOffice/PhpSpreadsheet/issues/2488) +[PR #2489](https://github.com/PHPOffice/PhpSpreadsheet/pull/2489) +- Xlsx Reader fix height and width for oneCellAnchorDrawings. +[PR #2492](https://github.com/PHPOffice/PhpSpreadsheet/pull/2492) +- Fix rounding error in NumberFormat::NUMBER_PERCENTAGE, NumberFormat::NUMBER_PERCENTAGE_00. [PR #2555](https://github.com/PHPOffice/PhpSpreadsheet/pull/2555) +- Don't treat thumbnail file as xml. +[Issue #2516](https://github.com/PHPOffice/PhpSpreadsheet/issues/2516) +[PR #2517](https://github.com/PHPOffice/PhpSpreadsheet/pull/2517) +- Eliminating Xlsx Reader warning when no sz tag for RichText. +[Issue #2542](https://github.com/PHPOffice/PhpSpreadsheet/issues/2542) +[PR #2550](https://github.com/PHPOffice/PhpSpreadsheet/pull/2550) +- Fix Xlsx/Xls Writer handling of inline strings. +[Issue #353](https://github.com/PHPOffice/PhpSpreadsheet/issues/353) +[PR #2569](https://github.com/PHPOffice/PhpSpreadsheet/pull/2569) +- Richtext colors were not being read correctly after namespace change [#2458](https://github.com/PHPOffice/PhpSpreadsheet/issues/2458) +- Fix discrepancy between the way markdown tables are rendered in ReadTheDocs and in PHPStorm [#2520](https://github.com/PHPOffice/PhpSpreadsheet/issues/2520) +- Update Russian Functions Text File [#2557](https://github.com/PHPOffice/PhpSpreadsheet/issues/2557) +- Fix documentation, instantiation example [#2564](https://github.com/PHPOffice/PhpSpreadsheet/issues/2564) + + ## 1.21.0 - 2022-01-06 ### Added diff --git a/vendor/phpoffice/phpspreadsheet/composer.json b/vendor/phpoffice/phpspreadsheet/composer.json index d80fc62ff..c0664de39 100644 --- a/vendor/phpoffice/phpspreadsheet/composer.json +++ b/vendor/phpoffice/phpspreadsheet/composer.json @@ -12,7 +12,10 @@ "spreadsheet" ], "config": { - "sort-packages": true + "sort-packages": true, + "allow-plugins": { + "dealerdirect/phpcodesniffer-composer-installer": true + } }, "homepage": "https://github.com/PHPOffice/PhpSpreadsheet", "type": "library", @@ -79,7 +82,7 @@ "dompdf/dompdf": "^1.0", "friendsofphp/php-cs-fixer": "^3.2", "jpgraph/jpgraph": "^4.0", - "mpdf/mpdf": "^8.0", + "mpdf/mpdf": "8.0.17", "phpcompatibility/php-compatibility": "^9.3", "phpstan/phpstan": "^1.1", "phpstan/phpstan-phpunit": "^1.0", diff --git a/vendor/phpoffice/phpspreadsheet/phpstan-baseline.neon b/vendor/phpoffice/phpspreadsheet/phpstan-baseline.neon index db35c729d..acafd3b1c 100644 --- a/vendor/phpoffice/phpspreadsheet/phpstan-baseline.neon +++ b/vendor/phpoffice/phpspreadsheet/phpstan-baseline.neon @@ -5,51 +5,6 @@ parameters: count: 3 path: src/PhpSpreadsheet/Calculation/Calculation.php - - - message: "#^Argument of an invalid type mixed supplied for foreach, only iterables are supported\\.$#" - count: 2 - path: src/PhpSpreadsheet/Calculation/Calculation.php - - - - message: "#^Cannot access offset 'onlyIf' on mixed\\.$#" - count: 3 - path: src/PhpSpreadsheet/Calculation/Calculation.php - - - - message: "#^Cannot access offset 'onlyIfNot' on mixed\\.$#" - count: 3 - path: src/PhpSpreadsheet/Calculation/Calculation.php - - - - message: "#^Cannot access offset 'reference' on mixed\\.$#" - count: 2 - path: src/PhpSpreadsheet/Calculation/Calculation.php - - - - message: "#^Cannot access offset 'storeKey' on mixed\\.$#" - count: 2 - path: src/PhpSpreadsheet/Calculation/Calculation.php - - - - message: "#^Cannot access offset 'type' on mixed\\.$#" - count: 2 - path: src/PhpSpreadsheet/Calculation/Calculation.php - - - - message: "#^Cannot access offset 'value' on mixed\\.$#" - count: 16 - path: src/PhpSpreadsheet/Calculation/Calculation.php - - - - message: "#^Cannot access offset 0 on mixed\\.$#" - count: 4 - path: src/PhpSpreadsheet/Calculation/Calculation.php - - - - message: "#^Cannot access offset int on mixed\\.$#" - count: 16 - path: src/PhpSpreadsheet/Calculation/Calculation.php - - message: "#^Cannot call method attach\\(\\) on PhpOffice\\\\PhpSpreadsheet\\\\Cell\\\\Cell\\|null\\.$#" count: 1 @@ -100,11 +55,6 @@ parameters: count: 1 path: src/PhpSpreadsheet/Calculation/Calculation.php - - - message: "#^Cannot use array destructuring on mixed\\.$#" - count: 6 - path: src/PhpSpreadsheet/Calculation/Calculation.php - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Calculation\\:\\:_translateFormulaToEnglish\\(\\) has no return type specified\\.$#" count: 1 @@ -175,26 +125,6 @@ parameters: count: 1 path: src/PhpSpreadsheet/Calculation/Calculation.php - - - message: "#^Parameter \\#1 \\$cellRange of static method PhpOffice\\\\PhpSpreadsheet\\\\Cell\\\\Coordinate\\:\\:extractAllCellReferencesInRange\\(\\) expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/Calculation.php - - - - message: "#^Parameter \\#1 \\$column of method PhpOffice\\\\PhpSpreadsheet\\\\Worksheet\\\\Worksheet\\:\\:getHighestDataRow\\(\\) expects string\\|null, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/Calculation.php - - - - message: "#^Parameter \\#1 \\$definedName of static method PhpOffice\\\\PhpSpreadsheet\\\\DefinedName\\:\\:resolveName\\(\\) expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/Calculation.php - - - - message: "#^Parameter \\#1 \\$formula of method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Calculation\\:\\:_calculateFormulaValue\\(\\) expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/Calculation.php - - message: "#^Parameter \\#1 \\$haystack of function stripos expects string, float\\|int\\|string given\\.$#" count: 1 @@ -211,65 +141,20 @@ parameters: path: src/PhpSpreadsheet/Calculation/Calculation.php - - message: "#^Parameter \\#1 \\$str(ing)? of function preg_quote expects string, int\\|string given\\.$#" + message: "#^Parameter \\#1 \\$str of function preg_quote expects string, int\\|string given\\.$#" count: 1 path: src/PhpSpreadsheet/Calculation/Calculation.php - - message: "#^Parameter \\#1 \\$str(ing)? of function strtoupper expects string, mixed given\\.$#" - count: 2 - path: src/PhpSpreadsheet/Calculation/Calculation.php - - - - message: "#^Parameter \\#1 \\$str(ing)? of function trim expects string, int\\|string given\\.$#" + message: "#^Parameter \\#1 \\$str of function trim expects string, int\\|string given\\.$#" count: 1 path: src/PhpSpreadsheet/Calculation/Calculation.php - - message: "#^Parameter \\#1 \\$str(ing)? of function trim expects string, mixed given\\.$#" - count: 3 - path: src/PhpSpreadsheet/Calculation/Calculation.php - - - - message: "#^Parameter \\#1 \\$str(ing)? of function trim expects string, null given\\.$#" + message: "#^Parameter \\#1 \\$str of function trim expects string, null given\\.$#" count: 2 path: src/PhpSpreadsheet/Calculation/Calculation.php - - - message: "#^Parameter \\#1 \\$str1 of method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Calculation\\:\\:strcmpAllowNull\\(\\) expects string\\|null, mixed given\\.$#" - count: 4 - path: src/PhpSpreadsheet/Calculation/Calculation.php - - - - message: "#^Parameter \\#1 \\$str1 of method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Calculation\\:\\:strcmpLowercaseFirst\\(\\) expects string\\|null, mixed given\\.$#" - count: 2 - path: src/PhpSpreadsheet/Calculation/Calculation.php - - - - message: "#^Parameter \\#1 \\$string of function strlen expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/Calculation.php - - - - message: "#^Parameter \\#1 \\$textValue of static method PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\StringHelper\\:\\:strCaseReverse\\(\\) expects string, string\\|null given\\.$#" - count: 2 - path: src/PhpSpreadsheet/Calculation/Calculation.php - - - - message: "#^Parameter \\#1 \\$worksheetName of method PhpOffice\\\\PhpSpreadsheet\\\\Spreadsheet\\:\\:getSheetByName\\(\\) expects string, mixed given\\.$#" - count: 3 - path: src/PhpSpreadsheet/Calculation/Calculation.php - - - - message: "#^Parameter \\#2 \\$str2 of method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Calculation\\:\\:strcmpAllowNull\\(\\) expects string\\|null, mixed given\\.$#" - count: 4 - path: src/PhpSpreadsheet/Calculation/Calculation.php - - - - message: "#^Parameter \\#2 \\$subject of function preg_match expects string, mixed given\\.$#" - count: 4 - path: src/PhpSpreadsheet/Calculation/Calculation.php - - message: "#^Parameter \\#2 \\$worksheet of static method PhpOffice\\\\PhpSpreadsheet\\\\DefinedName\\:\\:resolveName\\(\\) expects PhpOffice\\\\PhpSpreadsheet\\\\Worksheet\\\\Worksheet, PhpOffice\\\\PhpSpreadsheet\\\\Worksheet\\\\Worksheet\\|null given\\.$#" count: 1 @@ -280,46 +165,6 @@ parameters: count: 2 path: src/PhpSpreadsheet/Calculation/Calculation.php - - - message: "#^Parameter \\#3 \\$subject of function str_replace expects array\\|string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/Calculation.php - - - - message: "#^Parameter \\#4 \\$operation of method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Calculation\\:\\:executeBinaryComparisonOperation\\(\\) expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/Calculation.php - - - - message: "#^Parameter \\#4 \\$storeKey of method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Token\\\\Stack\\:\\:push\\(\\) expects string\\|null, mixed given\\.$#" - count: 2 - path: src/PhpSpreadsheet/Calculation/Calculation.php - - - - message: "#^Parameter \\#5 \\$onlyIf of method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Token\\\\Stack\\:\\:push\\(\\) expects string\\|null, mixed given\\.$#" - count: 2 - path: src/PhpSpreadsheet/Calculation/Calculation.php - - - - message: "#^Parameter \\#6 \\$onlyIfNot of method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Token\\\\Stack\\:\\:push\\(\\) expects string\\|null, mixed given\\.$#" - count: 2 - path: src/PhpSpreadsheet/Calculation/Calculation.php - - - - message: "#^Part \\$argumentCount \\(mixed\\) of encapsed string cannot be cast to string\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/Calculation.php - - - - message: "#^Part \\$token \\(mixed\\) of encapsed string cannot be cast to string\\.$#" - count: 2 - path: src/PhpSpreadsheet/Calculation/Calculation.php - - - - message: "#^Part \\$val \\(mixed\\) of encapsed string cannot be cast to string\\.$#" - count: 2 - path: src/PhpSpreadsheet/Calculation/Calculation.php - - message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Calculation\\:\\:\\$branchPruningEnabled has no type specified\\.$#" count: 1 @@ -405,16 +250,6 @@ parameters: count: 2 path: src/PhpSpreadsheet/Calculation/Calculation.php - - - message: "#^Variable \\$inversedStr1 on left side of \\?\\? always exists and is not nullable\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/Calculation.php - - - - message: "#^Variable \\$inversedStr2 on left side of \\?\\? always exists and is not nullable\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/Calculation.php - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Database\\:\\:DMAX\\(\\) should return float but returns float\\|string\\|null\\.$#" count: 1 @@ -460,11 +295,6 @@ parameters: count: 1 path: src/PhpSpreadsheet/Calculation/Database.php - - - message: "#^Cannot access offset int\\|string\\|null on mixed\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/Database/DatabaseAbstract.php - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Database\\\\DatabaseAbstract\\:\\:buildCondition\\(\\) has parameter \\$criterion with no type specified\\.$#" count: 1 @@ -495,236 +325,21 @@ parameters: count: 1 path: src/PhpSpreadsheet/Calculation/Database/DatabaseAbstract.php - - - message: "#^Parameter \\#1 \\$callback of function array_map expects \\(callable\\(mixed\\)\\: mixed\\)\\|null, 'strtoupper' given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/Database/DatabaseAbstract.php - - - - message: "#^Parameter \\#1 \\$criteriaNames of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Database\\\\DatabaseAbstract\\:\\:buildQuery\\(\\) expects array, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/Database/DatabaseAbstract.php - - - - message: "#^Parameter \\#1 \\$(input|array) of function array_keys expects array, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/Database/DatabaseAbstract.php - - - - message: "#^Parameter \\#1 \\$str(ing)? of function strtoupper expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/Database/DatabaseAbstract.php - - - - message: "#^Parameter \\#2 \\$array of function array_map expects array, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/Database/DatabaseAbstract.php - - - - message: "#^Parameter \\#3 \\$criteria of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Database\\\\DatabaseAbstract\\:\\:executeQuery\\(\\) expects array, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/Database/DatabaseAbstract.php - - - - message: "#^Parameter \\#4 \\$fields of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Database\\\\DatabaseAbstract\\:\\:executeQuery\\(\\) expects array, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/Database/DatabaseAbstract.php - - - - message: "#^Cannot cast mixed to string\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/DateTimeExcel/Date.php - - - - message: "#^Parameter \\#1 \\$day of static method PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\Date\\:\\:dayStringToNumber\\(\\) expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/DateTimeExcel/Date.php - - - - message: "#^Parameter \\#1 \\$monthName of static method PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\Date\\:\\:monthStringToNumber\\(\\) expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/DateTimeExcel/Date.php - - - - message: "#^Parameter \\#1 \\$str(ing)? of function trim expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/DateTimeExcel/DateValue.php - - message: "#^Variable \\$dateValue on left side of \\?\\? always exists and is not nullable\\.$#" count: 1 path: src/PhpSpreadsheet/Calculation/DateTimeExcel/DateValue.php - - - message: "#^Parameter \\#1 \\$str(ing)? of function strtoupper expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/DateTimeExcel/Difference.php - - - - message: "#^Parameter \\#1 \\$excelTimestamp of static method PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\Date\\:\\:excelToDateTimeObject\\(\\) expects float\\|int, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/DateTimeExcel/Helpers.php - - - - message: "#^Parameter \\#1 \\$(x|num1) of function fmod expects float, mixed given\\.$#" - count: 3 - path: src/PhpSpreadsheet/Calculation/DateTimeExcel/TimeParts.php - - - - message: "#^Parameter \\#1 \\$str(ing)? of function trim expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/DateTimeExcel/TimeValue.php - - message: "#^Variable \\$timeValue on left side of \\?\\? always exists and is not nullable\\.$#" count: 1 path: src/PhpSpreadsheet/Calculation/DateTimeExcel/TimeValue.php - - - message: "#^Binary operation \"/\" between int\\|string and \\(float\\|int\\) results in an error\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/DateTimeExcel/YearFrac.php - - - - message: "#^Binary operation \"/\" between int\\|string and 360 results in an error\\.$#" - count: 3 - path: src/PhpSpreadsheet/Calculation/DateTimeExcel/YearFrac.php - - - - message: "#^Binary operation \"/\" between int\\|string and 365 results in an error\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/DateTimeExcel/YearFrac.php - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Engine\\\\Logger\\:\\:writeDebugLog\\(\\) has parameter \\$args with no type specified\\.$#" count: 1 path: src/PhpSpreadsheet/Calculation/Engine/Logger.php - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Engineering\\:\\:BITLSHIFT\\(\\) should return int\\|string but returns float\\|int\\|string\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/Engineering.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Engineering\\:\\:BITRSHIFT\\(\\) should return int\\|string but returns float\\|int\\|string\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/Engineering.php - - - - message: "#^Parameter \\#1 \\$category of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Engineering\\\\ConvertUOM\\:\\:getConversionCategoryUnitDetails\\(\\) expects string\\|null, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/Engineering.php - - - - message: "#^Parameter \\#1 \\$category of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Engineering\\\\ConvertUOM\\:\\:getConversionCategoryUnits\\(\\) expects string\\|null, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/Engineering.php - - - - message: "#^Parameter \\#1 \\$value of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Engineering\\\\ConvertBinary\\:\\:toDecimal\\(\\) expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/Engineering.php - - - - message: "#^Parameter \\#1 \\$value of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Engineering\\\\ConvertBinary\\:\\:toHex\\(\\) expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/Engineering.php - - - - message: "#^Parameter \\#1 \\$value of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Engineering\\\\ConvertBinary\\:\\:toOctal\\(\\) expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/Engineering.php - - - - message: "#^Parameter \\#1 \\$value of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Engineering\\\\ConvertDecimal\\:\\:toBinary\\(\\) expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/Engineering.php - - - - message: "#^Parameter \\#1 \\$value of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Engineering\\\\ConvertDecimal\\:\\:toHex\\(\\) expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/Engineering.php - - - - message: "#^Parameter \\#1 \\$value of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Engineering\\\\ConvertDecimal\\:\\:toOctal\\(\\) expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/Engineering.php - - - - message: "#^Parameter \\#1 \\$value of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Engineering\\\\ConvertHex\\:\\:toBinary\\(\\) expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/Engineering.php - - - - message: "#^Parameter \\#1 \\$value of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Engineering\\\\ConvertHex\\:\\:toDecimal\\(\\) expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/Engineering.php - - - - message: "#^Parameter \\#1 \\$value of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Engineering\\\\ConvertHex\\:\\:toOctal\\(\\) expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/Engineering.php - - - - message: "#^Parameter \\#1 \\$value of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Engineering\\\\ConvertOctal\\:\\:toBinary\\(\\) expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/Engineering.php - - - - message: "#^Parameter \\#1 \\$value of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Engineering\\\\ConvertOctal\\:\\:toDecimal\\(\\) expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/Engineering.php - - - - message: "#^Parameter \\#1 \\$value of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Engineering\\\\ConvertOctal\\:\\:toHex\\(\\) expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/Engineering.php - - - - message: "#^Parameter \\#2 \\$places of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Engineering\\\\ConvertBinary\\:\\:toHex\\(\\) expects int\\|null, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/Engineering.php - - - - message: "#^Parameter \\#2 \\$places of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Engineering\\\\ConvertBinary\\:\\:toOctal\\(\\) expects int\\|null, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/Engineering.php - - - - message: "#^Parameter \\#2 \\$places of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Engineering\\\\ConvertDecimal\\:\\:toBinary\\(\\) expects int\\|null, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/Engineering.php - - - - message: "#^Parameter \\#2 \\$places of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Engineering\\\\ConvertDecimal\\:\\:toHex\\(\\) expects int\\|null, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/Engineering.php - - - - message: "#^Parameter \\#2 \\$places of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Engineering\\\\ConvertDecimal\\:\\:toOctal\\(\\) expects int\\|null, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/Engineering.php - - - - message: "#^Parameter \\#2 \\$places of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Engineering\\\\ConvertHex\\:\\:toBinary\\(\\) expects int\\|null, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/Engineering.php - - - - message: "#^Parameter \\#2 \\$places of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Engineering\\\\ConvertHex\\:\\:toOctal\\(\\) expects int\\|null, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/Engineering.php - - - - message: "#^Parameter \\#2 \\$places of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Engineering\\\\ConvertOctal\\:\\:toBinary\\(\\) expects int\\|null, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/Engineering.php - - - - message: "#^Parameter \\#2 \\$places of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Engineering\\\\ConvertOctal\\:\\:toHex\\(\\) expects int\\|null, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/Engineering.php - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Engineering\\\\BesselJ\\:\\:besselj2a\\(\\) has no return type specified\\.$#" count: 1 @@ -746,25 +361,15 @@ parameters: path: src/PhpSpreadsheet/Calculation/Engineering/BitWise.php - - message: "#^Parameter \\#1 \\$num(ber)? of function floor expects float(\\|int)?, float\\|int\\<0, 281474976710655\\>\\|string given\\.$#" + message: "#^Parameter \\#1 \\$number of function floor expects float, float\\|int\\<0, 281474976710655\\>\\|string given\\.$#" count: 1 path: src/PhpSpreadsheet/Calculation/Engineering/BitWise.php - - message: "#^Parameter \\#1 \\$num(ber)? of function floor expects float(\\|int)?, float\\|int\\|string given\\.$#" + message: "#^Parameter \\#1 \\$number of function floor expects float, float\\|int\\|string given\\.$#" count: 1 path: src/PhpSpreadsheet/Calculation/Engineering/BitWise.php - - - message: "#^Parameter \\#1 \\$complexNumber of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Engineering\\\\ComplexFunctions\\:\\:IMARGUMENT\\(\\) expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/Engineering/ComplexFunctions.php - - - - message: "#^Parameter \\#1 \\$power of method Complex\\\\Complex\\:\\:pow\\(\\) expects float\\|int, float\\|int\\|string given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/Engineering/ComplexFunctions.php - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Engineering\\\\ConvertBase\\:\\:validatePlaces\\(\\) has parameter \\$places with no type specified\\.$#" count: 1 @@ -775,31 +380,6 @@ parameters: count: 1 path: src/PhpSpreadsheet/Calculation/Engineering/ConvertBase.php - - - message: "#^Cannot access offset 'AllowPrefix' on mixed\\.$#" - count: 3 - path: src/PhpSpreadsheet/Calculation/Engineering/ConvertUOM.php - - - - message: "#^Cannot access offset 'Group' on mixed\\.$#" - count: 9 - path: src/PhpSpreadsheet/Calculation/Engineering/ConvertUOM.php - - - - message: "#^Cannot access offset 'Unit Name' on mixed\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/Engineering/ConvertUOM.php - - - - message: "#^Cannot access offset 'multiplier' on mixed\\.$#" - count: 3 - path: src/PhpSpreadsheet/Calculation/Engineering/ConvertUOM.php - - - - message: "#^Cannot access offset mixed on mixed\\.$#" - count: 2 - path: src/PhpSpreadsheet/Calculation/Engineering/ConvertUOM.php - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Engineering\\\\ConvertUOM\\:\\:getUOMDetails\\(\\) has no return type specified\\.$#" count: 1 @@ -810,11 +390,6 @@ parameters: count: 1 path: src/PhpSpreadsheet/Calculation/Engineering/ConvertUOM.php - - - message: "#^Parameter \\#1 \\$uom of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Engineering\\\\ConvertUOM\\:\\:getUOMDetails\\(\\) expects string, mixed given\\.$#" - count: 2 - path: src/PhpSpreadsheet/Calculation/Engineering/ConvertUOM.php - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Engineering\\\\Erf\\:\\:erfValue\\(\\) has no return type specified\\.$#" count: 1 @@ -845,16 +420,6 @@ parameters: count: 1 path: src/PhpSpreadsheet/Calculation/Engineering/ErfC.php - - - message: "#^Parameter \\#1 \\$message of class PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Exception constructor expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/Exception.php - - - - message: "#^Parameter \\#2 \\$code of class PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Exception constructor expects int, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/Exception.php - - message: "#^Parameter \\#1 \\$callback of function set_error_handler expects \\(callable\\(int, string, string, int, array\\)\\: bool\\)\\|null, array\\{'PhpOffice\\\\\\\\PhpSpreadsheet\\\\\\\\Calculation\\\\\\\\Exception', 'errorHandlerCallback'\\} given\\.$#" count: 1 @@ -875,6 +440,11 @@ parameters: count: 1 path: src/PhpSpreadsheet/Calculation/Financial.php + - + message: "#^Parameter \\#1 \\$year of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\DateTimeExcel\\\\Helpers\\:\\:isLeapYear\\(\\) expects int\\|string, array\\|int\\|string given\\.$#" + count: 1 + path: src/PhpSpreadsheet/Calculation/Financial/Amortization.php + - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Financial\\\\CashFlow\\\\Constant\\\\Periodic\\\\Interest\\:\\:rateNextGuess\\(\\) has no return type specified\\.$#" count: 1 @@ -931,7 +501,7 @@ parameters: path: src/PhpSpreadsheet/Calculation/Financial/CashFlow/Constant/Periodic/InterestAndPrincipal.php - - message: "#^Parameter \\#4 \\$x2 of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Financial\\\\CashFlow\\\\Variable\\\\NonPeriodic\\:\\:xirrPart3\\(\\) expects float, mixed given\\.$#" + message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Financial\\\\CashFlow\\\\Variable\\\\NonPeriodic\\:\\:xnpvOrdered\\(\\) should return float\\|string but returns array\\|string\\.$#" count: 1 path: src/PhpSpreadsheet/Calculation/Financial/CashFlow/Variable/NonPeriodic.php @@ -940,6 +510,11 @@ parameters: count: 1 path: src/PhpSpreadsheet/Calculation/Financial/CashFlow/Variable/Periodic.php + - + message: "#^Parameter \\#1 \\$year of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Financial\\\\Helpers\\:\\:daysPerYear\\(\\) expects int\\|string, array\\|int\\|string given\\.$#" + count: 1 + path: src/PhpSpreadsheet/Calculation/Financial/Coupons.php + - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Financial\\\\Depreciation\\:\\:validateCost\\(\\) has parameter \\$cost with no type specified\\.$#" count: 1 @@ -970,26 +545,26 @@ parameters: count: 1 path: src/PhpSpreadsheet/Calculation/Financial/Depreciation.php - - - message: "#^Cannot cast mixed to int\\.$#" - count: 2 - path: src/PhpSpreadsheet/Calculation/Financial/Dollar.php - - - - message: "#^Parameter \\#1 \\$num(ber)? of function floor expects float(\\|int)?, mixed given\\.$#" - count: 2 - path: src/PhpSpreadsheet/Calculation/Financial/Dollar.php - - - - message: "#^Parameter \\#1 \\$(x|num1) of function fmod expects float, mixed given\\.$#" - count: 2 - path: src/PhpSpreadsheet/Calculation/Financial/Dollar.php - - message: "#^Binary operation \"/\" between float\\|string and float\\|string results in an error\\.$#" count: 2 path: src/PhpSpreadsheet/Calculation/Financial/Securities/Price.php + - + message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Financial\\\\Securities\\\\Price\\:\\:received\\(\\) should return float\\|string but returns array\\|string\\.$#" + count: 1 + path: src/PhpSpreadsheet/Calculation/Financial/Securities/Price.php + + - + message: "#^Parameter \\#1 \\$year of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Financial\\\\Helpers\\:\\:daysPerYear\\(\\) expects int\\|string, array\\|int\\|string given\\.$#" + count: 1 + path: src/PhpSpreadsheet/Calculation/Financial/Securities/Price.php + + - + message: "#^Parameter \\#1 \\$year of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Financial\\\\Helpers\\:\\:daysPerYear\\(\\) expects int\\|string, array\\|int\\|string given\\.$#" + count: 2 + path: src/PhpSpreadsheet/Calculation/Financial/Securities/Yields.php + - message: "#^Cannot call method getTokenSubType\\(\\) on PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\FormulaToken\\|null\\.$#" count: 4 @@ -1025,11 +600,6 @@ parameters: count: 1 path: src/PhpSpreadsheet/Calculation/Functions.php - - - message: "#^Cannot cast mixed to string\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/Functions.php - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Functions\\:\\:ifCondition\\(\\) has no return type specified\\.$#" count: 1 @@ -1080,11 +650,6 @@ parameters: count: 1 path: src/PhpSpreadsheet/Calculation/Functions.php - - - message: "#^Parameter \\#1 \\$number of function abs expects float\\|int\\|string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/Functions.php - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Internal\\\\MakeMatrix\\:\\:make\\(\\) has parameter \\$args with no type specified\\.$#" count: 1 @@ -1105,11 +670,6 @@ parameters: count: 1 path: src/PhpSpreadsheet/Calculation/LookupRef.php - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\LookupRef\\:\\:HYPERLINK\\(\\) should return string but returns mixed\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/LookupRef.php - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\LookupRef\\:\\:OFFSET\\(\\) should return array\\|string but returns array\\|int\\|string\\.$#" count: 1 @@ -1120,46 +680,6 @@ parameters: count: 1 path: src/PhpSpreadsheet/Calculation/LookupRef/Address.php - - - message: "#^Parameter \\#1 \\$row of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\LookupRef\\\\Address\\:\\:formatAsA1\\(\\) expects int, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/LookupRef/Address.php - - - - message: "#^Parameter \\#1 \\$row of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\LookupRef\\\\Address\\:\\:formatAsR1C1\\(\\) expects int, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/LookupRef/Address.php - - - - message: "#^Parameter \\#1 \\$sheetName of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\LookupRef\\\\Address\\:\\:sheetName\\(\\) expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/LookupRef/Address.php - - - - message: "#^Parameter \\#2 \\$column of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\LookupRef\\\\Address\\:\\:formatAsA1\\(\\) expects int, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/LookupRef/Address.php - - - - message: "#^Parameter \\#2 \\$column of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\LookupRef\\\\Address\\:\\:formatAsR1C1\\(\\) expects int, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/LookupRef/Address.php - - - - message: "#^Parameter \\#3 \\$relativity of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\LookupRef\\\\Address\\:\\:formatAsA1\\(\\) expects int, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/LookupRef/Address.php - - - - message: "#^Parameter \\#3 \\$relativity of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\LookupRef\\\\Address\\:\\:formatAsR1C1\\(\\) expects int, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/LookupRef/Address.php - - - - message: "#^Cannot cast mixed to int\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/LookupRef/ExcelMatch.php - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\LookupRef\\\\ExcelMatch\\:\\:matchFirstValue\\(\\) has no return type specified\\.$#" count: 1 @@ -1240,56 +760,6 @@ parameters: count: 1 path: src/PhpSpreadsheet/Calculation/LookupRef/ExcelMatch.php - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\LookupRef\\\\Formula\\:\\:text\\(\\) should return string but returns mixed\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/LookupRef/Formula.php - - - - message: "#^Parameter \\#2 \\$subject of function preg_match expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/LookupRef/Formula.php - - - - message: "#^Parameter \\#1 \\$lookupArray of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\LookupRef\\\\HLookup\\:\\:convertLiteralArray\\(\\) expects array, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/LookupRef/HLookup.php - - - - message: "#^Parameter \\#1 \\$textValue of static method PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\StringHelper\\:\\:strToLower\\(\\) expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/LookupRef/HLookup.php - - - - message: "#^Cannot use array destructuring on mixed\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/LookupRef/Helpers.php - - - - message: "#^Parameter \\#1 \\$str(ing)? of function trim expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/LookupRef/Helpers.php - - - - message: "#^Parameter \\#1 \\$str(ing)? of function trim expects string, mixed given\\.$#" - count: 2 - path: src/PhpSpreadsheet/Calculation/LookupRef/Hyperlink.php - - - - message: "#^Parameter \\#1 \\$tooltip of method PhpOffice\\\\PhpSpreadsheet\\\\Cell\\\\Hyperlink\\:\\:setTooltip\\(\\) expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/LookupRef/Hyperlink.php - - - - message: "#^Parameter \\#1 \\$url of method PhpOffice\\\\PhpSpreadsheet\\\\Cell\\\\Hyperlink\\:\\:setUrl\\(\\) expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/LookupRef/Hyperlink.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\LookupRef\\\\Indirect\\:\\:INDIRECT\\(\\) should return array\\|string but returns mixed\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/LookupRef/Indirect.php - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\LookupRef\\\\Lookup\\:\\:verifyResultVector\\(\\) has no return type specified\\.$#" count: 1 @@ -1320,26 +790,11 @@ parameters: count: 1 path: src/PhpSpreadsheet/Calculation/LookupRef/LookupBase.php - - - message: "#^Parameter \\#1 \\$message of class PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Exception constructor expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/LookupRef/LookupRefValidations.php - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\LookupRef\\\\Matrix\\:\\:extractRowValue\\(\\) has no return type specified\\.$#" count: 1 path: src/PhpSpreadsheet/Calculation/LookupRef/Matrix.php - - - message: "#^Binary operation \"\\+\\=\" between string and mixed results in an error\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/LookupRef/Offset.php - - - - message: "#^Cannot use array destructuring on mixed\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/LookupRef/Offset.php - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\LookupRef\\\\Offset\\:\\:adjustEndCellColumnForWidth\\(\\) has no return type specified\\.$#" count: 1 @@ -1380,61 +835,21 @@ parameters: count: 1 path: src/PhpSpreadsheet/Calculation/LookupRef/Offset.php - - - message: "#^Parameter \\#1 \\$str(ing)? of function trim expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/LookupRef/Offset.php - - - - message: "#^Cannot use array destructuring on mixed\\.$#" - count: 2 - path: src/PhpSpreadsheet/Calculation/LookupRef/RowColumnInformation.php - - message: "#^Parameter \\#1 \\$columnAddress of static method PhpOffice\\\\PhpSpreadsheet\\\\Cell\\\\Coordinate\\:\\:columnIndexFromString\\(\\) expects string, string\\|null given\\.$#" count: 3 path: src/PhpSpreadsheet/Calculation/LookupRef/RowColumnInformation.php - - message: "#^Parameter \\#1 \\$haystack of function strpos expects string, mixed given\\.$#" - count: 2 - path: src/PhpSpreadsheet/Calculation/LookupRef/RowColumnInformation.php - - - - message: "#^Parameter \\#1 \\$(low|start) of function range expects float\\|int\\|string, string\\|null given\\.$#" + message: "#^Parameter \\#1 \\$low of function range expects float\\|int\\|string, string\\|null given\\.$#" count: 1 path: src/PhpSpreadsheet/Calculation/LookupRef/RowColumnInformation.php - - message: "#^Parameter \\#2 \\$(high|end) of function range expects float\\|int\\|string, string\\|null given\\.$#" + message: "#^Parameter \\#2 \\$high of function range expects float\\|int\\|string, string\\|null given\\.$#" count: 1 path: src/PhpSpreadsheet/Calculation/LookupRef/RowColumnInformation.php - - - message: "#^Parameter \\#2 \\$str(ing)? of function explode expects string, mixed given\\.$#" - count: 3 - path: src/PhpSpreadsheet/Calculation/LookupRef/RowColumnInformation.php - - - - message: "#^Parameter \\#3 \\$subject of function preg_replace expects array\\|string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/LookupRef/RowColumnInformation.php - - - - message: "#^Cannot access offset \\(int\\|string\\) on mixed\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/LookupRef/VLookup.php - - - - message: "#^Cannot access offset int\\|string\\|null on mixed\\.$#" - count: 3 - path: src/PhpSpreadsheet/Calculation/LookupRef/VLookup.php - - - - message: "#^Cannot access offset mixed on mixed\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/LookupRef/VLookup.php - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\LookupRef\\\\VLookup\\:\\:vLookupSearch\\(\\) has no return type specified\\.$#" count: 1 @@ -1476,90 +891,35 @@ parameters: path: src/PhpSpreadsheet/Calculation/LookupRef/VLookup.php - - message: "#^Parameter \\#1 \\$array(_arg)? of function uasort expects array, mixed given\\.$#" + message: "#^Parameter \\#2 \\$callback of function uasort expects callable\\(T, T\\)\\: int, array\\{'self', 'vlookupSort'\\} given\\.$#" count: 1 path: src/PhpSpreadsheet/Calculation/LookupRef/VLookup.php - - message: "#^Parameter \\#1 \\$(input|array) of function array_keys expects array, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/LookupRef/VLookup.php - - - - message: "#^Parameter \\#2 \\$callback of function uasort expects callable\\(mixed, mixed\\)\\: int, array\\{'self', 'vlookupSort'\\} given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/LookupRef/VLookup.php - - - - message: "#^Parameter \\#1 \\$number of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\MathTrig\\\\Trig\\\\Cosine\\:\\:acos\\(\\) expects float, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/MathTrig.php - - - - message: "#^Parameter \\#1 \\$number of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\MathTrig\\\\Trig\\\\Cosine\\:\\:acosh\\(\\) expects float, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/MathTrig.php - - - - message: "#^Parameter \\#1 \\$number of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\MathTrig\\\\Trig\\\\Sine\\:\\:asin\\(\\) expects float, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/MathTrig.php - - - - message: "#^Parameter \\#1 \\$number of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\MathTrig\\\\Trig\\\\Sine\\:\\:asinh\\(\\) expects float, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/MathTrig.php - - - - message: "#^Parameter \\#1 \\$number of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\MathTrig\\\\Trig\\\\Tangent\\:\\:atan\\(\\) expects float, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/MathTrig.php - - - - message: "#^Parameter \\#1 \\$number of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\MathTrig\\\\Trig\\\\Tangent\\:\\:atanh\\(\\) expects float, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/MathTrig.php - - - - message: "#^Cannot cast mixed to string\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/MathTrig/Arabic.php - - - - message: "#^Binary operation \"/\" between float\\|int\\|string and float\\|int\\|string results in an error\\.$#" + message: "#^Binary operation \"/\" between array\\|float\\|int\\|string and array\\|float\\|int\\|string results in an error\\.$#" count: 2 path: src/PhpSpreadsheet/Calculation/MathTrig/Combinations.php - - message: "#^Binary operation \"/\" between float\\|int\\|string and float\\|int results in an error\\.$#" + message: "#^Parameter \\#1 \\$factVal of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\MathTrig\\\\Factorial\\:\\:fact\\(\\) expects array\\|float, int\\\\|int\\<0, max\\> given\\.$#" + count: 1 + path: src/PhpSpreadsheet/Calculation/MathTrig/Combinations.php + + - + message: "#^Binary operation \"/\" between array\\|float\\|int\\|string and float\\|int results in an error\\.$#" count: 1 path: src/PhpSpreadsheet/Calculation/MathTrig/Factorial.php - - message: "#^Cannot call method getWorksheet\\(\\) on mixed\\.$#" - count: 4 - path: src/PhpSpreadsheet/Calculation/MathTrig/Subtotal.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\MathTrig\\\\Subtotal\\:\\:evaluate\\(\\) should return float\\|string but returns mixed\\.$#" + message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\MathTrig\\\\IntClass\\:\\:evaluate\\(\\) should return array\\|string but returns int\\.$#" count: 1 - path: src/PhpSpreadsheet/Calculation/MathTrig/Subtotal.php + path: src/PhpSpreadsheet/Calculation/MathTrig/IntClass.php - message: "#^PHPDoc tag @var for constant PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\MathTrig\\\\Subtotal\\:\\:CALL_FUNCTIONS with type array\\ is not subtype of value array\\{1\\: array\\{'PhpOffice…', 'average'\\}, 2\\: array\\{'PhpOffice…', 'COUNT'\\}, 3\\: array\\{'PhpOffice…', 'COUNTA'\\}, 4\\: array\\{'PhpOffice…', 'max'\\}, 5\\: array\\{'PhpOffice…', 'min'\\}, 6\\: array\\{'PhpOffice…', 'product'\\}, 7\\: array\\{'PhpOffice…', 'STDEV'\\}, 8\\: array\\{'PhpOffice…', 'STDEVP'\\}, \\.\\.\\.\\}\\.$#" count: 1 path: src/PhpSpreadsheet/Calculation/MathTrig/Subtotal.php - - - message: "#^Parameter \\#1 \\$(input|array) of function array_filter expects array, mixed given\\.$#" - count: 2 - path: src/PhpSpreadsheet/Calculation/MathTrig/Subtotal.php - - - - message: "#^Parameter \\#2 \\$str(ing)? of function explode expects string, mixed given\\.$#" - count: 2 - path: src/PhpSpreadsheet/Calculation/MathTrig/Subtotal.php - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Statistical\\:\\:MAXIFS\\(\\) should return float but returns float\\|string\\|null\\.$#" count: 1 @@ -1570,21 +930,6 @@ parameters: count: 1 path: src/PhpSpreadsheet/Calculation/Statistical.php - - - message: "#^Parameter \\#1 \\$range of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Statistical\\\\Conditional\\:\\:AVERAGEIF\\(\\) expects array, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/Statistical.php - - - - message: "#^Parameter \\#1 \\$range of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Statistical\\\\Conditional\\:\\:COUNTIF\\(\\) expects array, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/Statistical.php - - - - message: "#^Binary operation \"\\-\" between mixed and float\\|string results in an error\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/Statistical/Averages.php - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Statistical\\\\Averages\\:\\:filterArguments\\(\\) has no return type specified\\.$#" count: 1 @@ -1640,36 +985,6 @@ parameters: count: 1 path: src/PhpSpreadsheet/Calculation/Statistical/Conditional.php - - - message: "#^Parameter \\#1 \\$range of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Statistical\\\\Conditional\\:\\:AVERAGEIF\\(\\) expects array, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/Statistical/Conditional.php - - - - message: "#^Parameter \\#1 \\$range of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Statistical\\\\Conditional\\:\\:COUNTIF\\(\\) expects array, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/Statistical/Conditional.php - - - - message: "#^Parameter \\#1 \\$range of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Statistical\\\\Conditional\\:\\:databaseFromRangeAndValue\\(\\) expects array, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/Statistical/Conditional.php - - - - message: "#^Parameter \\#2 \\$condition of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Statistical\\\\Conditional\\:\\:AVERAGEIF\\(\\) expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/Statistical/Conditional.php - - - - message: "#^Parameter \\#2 \\$valueRange of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Statistical\\\\Conditional\\:\\:databaseFromRangeAndValue\\(\\) expects array, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/Statistical/Conditional.php - - - - message: "#^Parameter \\#3 \\$averageRange of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Statistical\\\\Conditional\\:\\:AVERAGEIF\\(\\) expects array, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/Statistical/Conditional.php - - message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Statistical\\\\Distributions\\\\Beta\\:\\:\\$logBetaCacheP has no type specified\\.$#" count: 1 @@ -1685,11 +1000,6 @@ parameters: count: 1 path: src/PhpSpreadsheet/Calculation/Statistical/Distributions/Beta.php - - - message: "#^Static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Statistical\\\\Distributions\\\\Beta\\:\\:regularizedIncompleteBeta\\(\\) is unused\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/Statistical/Distributions/Beta.php - - message: "#^Constant PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Statistical\\\\Distributions\\\\ChiSquared\\:\\:MAX_ITERATIONS is unused\\.$#" count: 1 @@ -1755,11 +1065,6 @@ parameters: count: 1 path: src/PhpSpreadsheet/Calculation/Statistical/Distributions/ChiSquared.php - - - message: "#^Parameter \\#1 \\$(var|value) of function count expects array\\|Countable, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/Statistical/Distributions/ChiSquared.php - - message: "#^Parameter \\#2 \\$columns of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Statistical\\\\Distributions\\\\ChiSquared\\:\\:degrees\\(\\) expects int, float\\|int\\<0, max\\> given\\.$#" count: 1 @@ -1825,6 +1130,11 @@ parameters: count: 1 path: src/PhpSpreadsheet/Calculation/Statistical/Distributions/Normal.php + - + message: "#^Parameter \\#1 \\$factVal of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\MathTrig\\\\Factorial\\:\\:fact\\(\\) expects array\\|float, int\\<0, max\\> given\\.$#" + count: 1 + path: src/PhpSpreadsheet/Calculation/Statistical/Distributions/Poisson.php + - message: "#^Binary operation \"\\-\" between float\\|string and float\\|int\\|numeric\\-string results in an error\\.$#" count: 1 @@ -1856,7 +1166,7 @@ parameters: path: src/PhpSpreadsheet/Calculation/Statistical/Percentiles.php - - message: "#^Binary operation \"/\" between float\\|int\\|string and float\\|int\\|string results in an error\\.$#" + message: "#^Binary operation \"/\" between array\\|float\\|int\\|string and array\\|float\\|int\\|string results in an error\\.$#" count: 1 path: src/PhpSpreadsheet/Calculation/Statistical/Permutations.php @@ -1905,91 +1215,16 @@ parameters: count: 1 path: src/PhpSpreadsheet/Calculation/TextData.php - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\TextData\\:\\:SEARCHINSENSITIVE\\(\\) should return string but returns int\\|string\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/TextData.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\TextData\\:\\:SEARCHSENSITIVE\\(\\) should return string but returns int\\|string\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/TextData.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\TextData\\:\\:TRIMNONPRINTABLE\\(\\) should return string but returns string\\|null\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/TextData.php - - - - message: "#^Parameter \\#1 \\$(glue|separator) of function implode expects (array\\|)?string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/TextData/Concatenate.php - - message: "#^Variable \\$value on left side of \\?\\? always exists and is not nullable\\.$#" count: 4 path: src/PhpSpreadsheet/Calculation/TextData/Extract.php - - - message: "#^Cannot cast mixed to string\\.$#" - count: 2 - path: src/PhpSpreadsheet/Calculation/TextData/Format.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\TextData\\\\Format\\:\\:VALUE\\(\\) should return DateTimeInterface\\|float\\|int\\|string but returns mixed\\.$#" - count: 2 - path: src/PhpSpreadsheet/Calculation/TextData/Format.php - - - - message: "#^Parameter \\#1 \\$dateValue of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\DateTimeExcel\\\\DateValue\\:\\:fromString\\(\\) expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/TextData/Format.php - - - - message: "#^Parameter \\#1 \\$haystack of function strpos expects string, mixed given\\.$#" - count: 2 - path: src/PhpSpreadsheet/Calculation/TextData/Format.php - - - - message: "#^Parameter \\#1 \\$str(ing)? of function trim expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/TextData/Format.php - - - - message: "#^Parameter \\#1 \\$timeValue of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\DateTimeExcel\\\\TimeValue\\:\\:fromString\\(\\) expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/TextData/Format.php - - - - message: "#^Parameter \\#2 \\$subject of function preg_match_all expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/TextData/Format.php - - - - message: "#^Parameter \\#3 \\$subject of function str_replace expects array\\|string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/TextData/Format.php - - - - message: "#^Cannot cast mixed to int\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/TextData/Helpers.php - - - - message: "#^Cannot cast mixed to string\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/TextData/Helpers.php - - message: "#^Variable \\$value on left side of \\?\\? always exists and is not nullable\\.$#" count: 1 path: src/PhpSpreadsheet/Calculation/TextData/Text.php - - - message: "#^Cannot access offset 'value' on mixed\\.$#" - count: 1 - path: src/PhpSpreadsheet/Calculation/Token/Stack.php - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Token\\\\Stack\\:\\:getStackItem\\(\\) has no return type specified\\.$#" count: 1 @@ -2025,46 +1260,6 @@ parameters: count: 1 path: src/PhpSpreadsheet/Calculation/Token/Stack.php - - - message: "#^Parameter \\#1 \\$dateValue of static method PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\Date\\:\\:stringToExcel\\(\\) expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Cell/AdvancedValueBinder.php - - - - message: "#^Parameter \\#1 \\$haystack of function strpos expects string, mixed given\\.$#" - count: 2 - path: src/PhpSpreadsheet/Cell/AdvancedValueBinder.php - - - - message: "#^Parameter \\#1 \\$value of method PhpOffice\\\\PhpSpreadsheet\\\\Cell\\\\AdvancedValueBinder\\:\\:setPercentage\\(\\) expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Cell/AdvancedValueBinder.php - - - - message: "#^Parameter \\#1 \\$value of method PhpOffice\\\\PhpSpreadsheet\\\\Cell\\\\AdvancedValueBinder\\:\\:setTimeHoursMinutes\\(\\) expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Cell/AdvancedValueBinder.php - - - - message: "#^Parameter \\#1 \\$value of method PhpOffice\\\\PhpSpreadsheet\\\\Cell\\\\AdvancedValueBinder\\:\\:setTimeHoursMinutesSeconds\\(\\) expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Cell/AdvancedValueBinder.php - - - - message: "#^Parameter \\#2 \\$subject of function preg_match expects string, mixed given\\.$#" - count: 7 - path: src/PhpSpreadsheet/Cell/AdvancedValueBinder.php - - - - message: "#^Parameter \\#3 \\$subject of function str_replace expects array\\|string, mixed given\\.$#" - count: 2 - path: src/PhpSpreadsheet/Cell/AdvancedValueBinder.php - - - - message: "#^Cannot cast mixed to string\\.$#" - count: 2 - path: src/PhpSpreadsheet/Cell/Cell.php - - message: "#^Elseif branch is unreachable because previous condition is always true\\.$#" count: 1 @@ -2075,11 +1270,6 @@ parameters: count: 1 path: src/PhpSpreadsheet/Cell/Cell.php - - - message: "#^Parameter \\#1 \\$textValue of static method PhpOffice\\\\PhpSpreadsheet\\\\Cell\\\\DataType\\:\\:checkString\\(\\) expects PhpOffice\\\\PhpSpreadsheet\\\\RichText\\\\RichText\\|string\\|null, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Cell/Cell.php - - message: "#^Parameter \\#2 \\$format of static method PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\NumberFormat\\:\\:toFormattedString\\(\\) expects string, string\\|null given\\.$#" count: 1 @@ -2111,32 +1301,12 @@ parameters: path: src/PhpSpreadsheet/Cell/Coordinate.php - - message: "#^Cannot use array destructuring on mixed\\.$#" - count: 2 - path: src/PhpSpreadsheet/Cell/Coordinate.php - - - - message: "#^Parameter \\#1 \\$cellAddress of static method PhpOffice\\\\PhpSpreadsheet\\\\Cell\\\\Coordinate\\:\\:absoluteCoordinate\\(\\) expects string, mixed given\\.$#" + message: "#^Parameter \\#1 \\$input of function array_chunk expects array, array\\\\|false given\\.$#" count: 1 path: src/PhpSpreadsheet/Cell/Coordinate.php - - message: "#^Parameter \\#1 \\$cellAddress of static method PhpOffice\\\\PhpSpreadsheet\\\\Cell\\\\Coordinate\\:\\:coordinateFromString\\(\\) expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Cell/Coordinate.php - - - - message: "#^Parameter \\#1 \\$(input|array) of function array_chunk expects array, array\\\\|false given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Cell/Coordinate.php - - - - message: "#^Parameter \\#1 \\$str(ing)? of function strtoupper expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Cell/Coordinate.php - - - - message: "#^Parameter \\#2 \\$str(ing)? of function explode expects string, array\\\\|string given\\.$#" + message: "#^Parameter \\#2 \\$str of function explode expects string, array\\\\|string given\\.$#" count: 1 path: src/PhpSpreadsheet/Cell/Coordinate.php @@ -2150,106 +1320,11 @@ parameters: count: 1 path: src/PhpSpreadsheet/Cell/Coordinate.php - - - message: "#^Cannot cast mixed to string\\.$#" - count: 1 - path: src/PhpSpreadsheet/Cell/DataType.php - - message: "#^Parameter \\#1 \\$textValue of static method PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\StringHelper\\:\\:substring\\(\\) expects string, string\\|null given\\.$#" count: 1 path: src/PhpSpreadsheet/Cell/DataType.php - - - message: "#^Parameter \\#1 \\$str(ing)? of function strtolower expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Cell/DataValidator.php - - - - message: "#^Parameter \\#1 \\$haystack of function strpos expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Cell/DefaultValueBinder.php - - - - message: "#^Parameter \\#1 \\$str(ing)? of function ltrim expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Cell/DefaultValueBinder.php - - - - message: "#^Parameter \\#2 \\$subject of function preg_match expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Cell/DefaultValueBinder.php - - - - message: "#^Cannot cast mixed to string\\.$#" - count: 1 - path: src/PhpSpreadsheet/Cell/StringValueBinder.php - - - - message: "#^Cannot access offset 'alpha' on mixed\\.$#" - count: 2 - path: src/PhpSpreadsheet/Chart/Axis.php - - - - message: "#^Cannot access offset 'size' on mixed\\.$#" - count: 4 - path: src/PhpSpreadsheet/Chart/Axis.php - - - - message: "#^Cannot access offset 'type' on mixed\\.$#" - count: 4 - path: src/PhpSpreadsheet/Chart/Axis.php - - - - message: "#^Cannot access offset 'value' on mixed\\.$#" - count: 2 - path: src/PhpSpreadsheet/Chart/Axis.php - - - - message: "#^Cannot access offset \\(int\\|string\\) on mixed\\.$#" - count: 2 - path: src/PhpSpreadsheet/Chart/Axis.php - - - - message: "#^Cannot access offset string on mixed\\.$#" - count: 2 - path: src/PhpSpreadsheet/Chart/Axis.php - - - - message: "#^Cannot cast mixed to int\\.$#" - count: 2 - path: src/PhpSpreadsheet/Chart/Axis.php - - - - message: "#^Cannot cast mixed to string\\.$#" - count: 2 - path: src/PhpSpreadsheet/Chart/Axis.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Chart\\\\Axis\\:\\:getAxisNumberFormat\\(\\) should return string but returns mixed\\.$#" - count: 1 - path: src/PhpSpreadsheet/Chart/Axis.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Chart\\\\Axis\\:\\:getAxisOptionsProperty\\(\\) should return string but returns mixed\\.$#" - count: 1 - path: src/PhpSpreadsheet/Chart/Axis.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Chart\\\\Axis\\:\\:getFillProperty\\(\\) should return string but returns mixed\\.$#" - count: 1 - path: src/PhpSpreadsheet/Chart/Axis.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Chart\\\\Axis\\:\\:getLineProperty\\(\\) should return string but returns mixed\\.$#" - count: 1 - path: src/PhpSpreadsheet/Chart/Axis.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Chart\\\\Axis\\:\\:getSoftEdgesSize\\(\\) should return string but returns mixed\\.$#" - count: 1 - path: src/PhpSpreadsheet/Chart/Axis.php - - message: "#^Parameter \\#1 \\$angle of method PhpOffice\\\\PhpSpreadsheet\\\\Chart\\\\Axis\\:\\:setShadowAngle\\(\\) expects int, int\\|null given\\.$#" count: 1 @@ -2260,16 +1335,6 @@ parameters: count: 1 path: src/PhpSpreadsheet/Chart/Axis.php - - - message: "#^Parameter \\#1 \\$color of method PhpOffice\\\\PhpSpreadsheet\\\\Chart\\\\Axis\\:\\:setGlowColor\\(\\) expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Chart/Axis.php - - - - message: "#^Parameter \\#1 \\$color of method PhpOffice\\\\PhpSpreadsheet\\\\Chart\\\\Axis\\:\\:setShadowColor\\(\\) expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Chart/Axis.php - - message: "#^Parameter \\#1 \\$distance of method PhpOffice\\\\PhpSpreadsheet\\\\Chart\\\\Axis\\:\\:setShadowDistance\\(\\) expects float, float\\|null given\\.$#" count: 1 @@ -2280,16 +1345,6 @@ parameters: count: 1 path: src/PhpSpreadsheet/Chart/Axis.php - - - message: "#^Parameter \\#3 \\$alphaType of method PhpOffice\\\\PhpSpreadsheet\\\\Chart\\\\Axis\\:\\:setShadowColor\\(\\) expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Chart/Axis.php - - - - message: "#^Parameter \\#3 \\$colorType of method PhpOffice\\\\PhpSpreadsheet\\\\Chart\\\\Axis\\:\\:setGlowColor\\(\\) expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Chart/Axis.php - - message: "#^Call to an undefined method object\\:\\:render\\(\\)\\.$#" count: 1 @@ -2380,21 +1435,11 @@ parameters: count: 1 path: src/PhpSpreadsheet/Chart/Chart.php - - - message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Chart\\\\Chart\\:\\:\\$name \\(string\\) does not accept mixed\\.$#" - count: 1 - path: src/PhpSpreadsheet/Chart/Chart.php - - message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Chart\\\\Chart\\:\\:\\$plotArea \\(PhpOffice\\\\PhpSpreadsheet\\\\Chart\\\\PlotArea\\) does not accept PhpOffice\\\\PhpSpreadsheet\\\\Chart\\\\PlotArea\\|null\\.$#" count: 1 path: src/PhpSpreadsheet/Chart/Chart.php - - - message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Chart\\\\Chart\\:\\:\\$plotVisibleOnly \\(bool\\) does not accept mixed\\.$#" - count: 1 - path: src/PhpSpreadsheet/Chart/Chart.php - - message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Chart\\\\Chart\\:\\:\\$title \\(PhpOffice\\\\PhpSpreadsheet\\\\Chart\\\\Title\\) does not accept PhpOffice\\\\PhpSpreadsheet\\\\Chart\\\\Title\\|null\\.$#" count: 1 @@ -2425,56 +1470,16 @@ parameters: count: 1 path: src/PhpSpreadsheet/Chart/Chart.php - - - message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Chart\\\\DataSeries\\:\\:\\$plotGrouping \\(string\\) does not accept mixed\\.$#" - count: 1 - path: src/PhpSpreadsheet/Chart/DataSeries.php - - - - message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Chart\\\\DataSeries\\:\\:\\$plotType \\(string\\) does not accept mixed\\.$#" - count: 1 - path: src/PhpSpreadsheet/Chart/DataSeries.php - - message: "#^Strict comparison using \\=\\=\\= between PhpOffice\\\\PhpSpreadsheet\\\\Chart\\\\DataSeriesValues and null will always evaluate to false\\.$#" count: 2 path: src/PhpSpreadsheet/Chart/DataSeries.php - - - message: "#^Argument of an invalid type mixed supplied for foreach, only iterables are supported\\.$#" - count: 2 - path: src/PhpSpreadsheet/Chart/DataSeriesValues.php - - - - message: "#^Cannot use array destructuring on mixed\\.$#" - count: 1 - path: src/PhpSpreadsheet/Chart/DataSeriesValues.php - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Chart\\\\DataSeriesValues\\:\\:refresh\\(\\) has parameter \\$flatten with no type specified\\.$#" count: 1 path: src/PhpSpreadsheet/Chart/DataSeriesValues.php - - - message: "#^Parameter \\#1 \\$(input|array) of function array_values expects array, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Chart/DataSeriesValues.php - - - - message: "#^Parameter \\#1 \\$(stack|array) of function array_shift expects array, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Chart/DataSeriesValues.php - - - - message: "#^Parameter \\#1 \\$(var|value) of function count expects array\\|Countable, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Chart/DataSeriesValues.php - - - - message: "#^Parameter \\#3 \\$subject of function str_replace expects array\\|string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Chart/DataSeriesValues.php - - message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Chart\\\\DataSeriesValues\\:\\:\\$dataSource \\(string\\) does not accept string\\|null\\.$#" count: 1 @@ -2485,31 +1490,11 @@ parameters: count: 1 path: src/PhpSpreadsheet/Chart/DataSeriesValues.php - - - message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Chart\\\\DataSeriesValues\\:\\:\\$dataValues \\(array\\) does not accept mixed\\.$#" - count: 1 - path: src/PhpSpreadsheet/Chart/DataSeriesValues.php - - message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Chart\\\\DataSeriesValues\\:\\:\\$fillColor \\(array\\\\|string\\) does not accept array\\\\|string\\|null\\.$#" count: 1 path: src/PhpSpreadsheet/Chart/DataSeriesValues.php - - - message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Chart\\\\DataSeriesValues\\:\\:\\$formatCode \\(string\\) does not accept mixed\\.$#" - count: 1 - path: src/PhpSpreadsheet/Chart/DataSeriesValues.php - - - - message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Chart\\\\DataSeriesValues\\:\\:\\$pointMarker \\(string\\) does not accept mixed\\.$#" - count: 1 - path: src/PhpSpreadsheet/Chart/DataSeriesValues.php - - - - message: "#^Cannot access offset \\(int\\|string\\) on mixed\\.$#" - count: 2 - path: src/PhpSpreadsheet/Chart/GridLines.php - - message: "#^Parameter \\#1 \\$angle of method PhpOffice\\\\PhpSpreadsheet\\\\Chart\\\\GridLines\\:\\:setShadowAngle\\(\\) expects int, int\\|null given\\.$#" count: 1 @@ -2930,21 +1915,6 @@ parameters: count: 1 path: src/PhpSpreadsheet/Chart/Title.php - - - message: "#^Cannot call method attach\\(\\) on mixed\\.$#" - count: 1 - path: src/PhpSpreadsheet/Collection/Cells.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Collection\\\\Cells\\:\\:get\\(\\) should return PhpOffice\\\\PhpSpreadsheet\\\\Cell\\\\Cell\\|null but returns mixed\\.$#" - count: 1 - path: src/PhpSpreadsheet/Collection/Cells.php - - - - message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Collection\\\\Cells\\:\\:\\$currentCell \\(PhpOffice\\\\PhpSpreadsheet\\\\Cell\\\\Cell\\|null\\) does not accept mixed\\.$#" - count: 1 - path: src/PhpSpreadsheet/Collection/Cells.php - - message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Collection\\\\Memory\\:\\:\\$cache has no type specified\\.$#" count: 1 @@ -2965,21 +1935,6 @@ parameters: count: 2 path: src/PhpSpreadsheet/DefinedName.php - - - message: "#^Cannot cast mixed to float\\.$#" - count: 1 - path: src/PhpSpreadsheet/Document/Properties.php - - - - message: "#^Cannot cast mixed to int\\.$#" - count: 1 - path: src/PhpSpreadsheet/Document/Properties.php - - - - message: "#^Parameter \\#1 \\$timestamp of static method PhpOffice\\\\PhpSpreadsheet\\\\Document\\\\Properties\\:\\:intOrFloatTimestamp\\(\\) expects float\\|int\\|string\\|null, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Document/Properties.php - - message: "#^Cannot use array destructuring on array\\|null\\.$#" count: 1 @@ -3036,7 +1991,7 @@ parameters: path: src/PhpSpreadsheet/Helper/Html.php - - message: "#^Parameter \\#1 \\$(function|callback) of function call_user_func expects callable\\(\\)\\: mixed, array\\{\\$this\\(PhpOffice\\\\PhpSpreadsheet\\\\Helper\\\\Html\\), mixed\\} given\\.$#" + message: "#^Parameter \\#1 \\$function of function call_user_func expects callable\\(\\)\\: mixed, array\\{\\$this\\(PhpOffice\\\\PhpSpreadsheet\\\\Helper\\\\Html\\), mixed\\} given\\.$#" count: 1 path: src/PhpSpreadsheet/Helper/Html.php @@ -3115,11 +2070,6 @@ parameters: count: 1 path: src/PhpSpreadsheet/Helper/Html.php - - - message: "#^Cannot access offset 0 on mixed\\.$#" - count: 1 - path: src/PhpSpreadsheet/Helper/Sample.php - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Helper\\\\Sample\\:\\:getSamples\\(\\) should return array\\\\> but returns array\\\\>\\.$#" count: 1 @@ -3145,11 +2095,6 @@ parameters: count: 1 path: src/PhpSpreadsheet/Helper/Sample.php - - - message: "#^Parameter \\#3 \\$subject of function str_replace expects array\\|string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Helper/Sample.php - - message: "#^Parameter \\#3 \\$subject of function str_replace expects array\\|string, string\\|false given\\.$#" count: 1 @@ -3190,21 +2135,11 @@ parameters: count: 1 path: src/PhpSpreadsheet/Reader/BaseReader.php - - - message: "#^Cannot use array destructuring on mixed\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Gnumeric.php - - message: "#^Comparison operation \"\\<\" between int and SimpleXMLElement\\|null results in an error\\.$#" count: 2 path: src/PhpSpreadsheet/Reader/Gnumeric.php - - - message: "#^Parameter \\#1 \\$str(ing)? of function trim expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Gnumeric.php - - message: "#^Offset 'percentage' does not exist on SimpleXMLElement\\|null\\.$#" count: 1 @@ -3230,11 +2165,6 @@ parameters: count: 2 path: src/PhpSpreadsheet/Reader/Gnumeric/Styles.php - - - message: "#^Cannot cast mixed to string\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Html.php - - message: "#^Variable \\$value on left side of \\?\\? always exists and is not nullable\\.$#" count: 1 @@ -3300,16 +2230,6 @@ parameters: count: 2 path: src/PhpSpreadsheet/Reader/Ods.php - - - message: "#^Cannot use array destructuring on mixed\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Ods/DefinedNames.php - - - - message: "#^Parameter \\#1 \\$worksheetName of method PhpOffice\\\\PhpSpreadsheet\\\\Spreadsheet\\:\\:getSheetByName\\(\\) expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Ods/DefinedNames.php - - message: "#^Cannot call method getElementsByTagNameNS\\(\\) on DOMElement\\|null\\.$#" count: 3 @@ -3420,11 +2340,6 @@ parameters: count: 1 path: src/PhpSpreadsheet/Reader/Security/XmlScanner.php - - - message: "#^Parameter \\#4 \\$cellData of method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Slk\\:\\:processCFinal\\(\\) expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Slk.php - - message: "#^Call to an undefined method PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\Escher\\|PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\Escher\\\\DgContainer\\|PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\Escher\\\\DgContainer\\\\SpgrContainer\\|PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\Escher\\\\DgContainer\\\\SpgrContainer\\\\SpContainer\\|PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\Escher\\\\DggContainer\\|PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\Escher\\\\DggContainer\\\\BstoreContainer\\|PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\Escher\\\\DggContainer\\\\BstoreContainer\\\\BSE\\:\\:getDgContainer\\(\\)\\.$#" count: 1 @@ -3475,21 +2390,11 @@ parameters: count: 1 path: src/PhpSpreadsheet/Reader/Xls.php - - - message: "#^Cannot access offset 0 on mixed\\.$#" - count: 4 - path: src/PhpSpreadsheet/Reader/Xls.php - - message: "#^Cannot access offset 1 on array\\|false\\.$#" count: 1 path: src/PhpSpreadsheet/Reader/Xls.php - - - message: "#^Cannot access offset 1 on mixed\\.$#" - count: 7 - path: src/PhpSpreadsheet/Reader/Xls.php - - message: "#^If condition is always true\\.$#" count: 1 @@ -3530,11 +2435,6 @@ parameters: count: 1 path: src/PhpSpreadsheet/Reader/Xls.php - - - message: "#^Parameter \\#1 \\$haystack of function strpos expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xls.php - - message: "#^Parameter \\#1 \\$operator of method PhpOffice\\\\PhpSpreadsheet\\\\Cell\\\\DataValidation\\:\\:setOperator\\(\\) expects string, int\\|string given\\.$#" count: 1 @@ -3550,26 +2450,11 @@ parameters: count: 1 path: src/PhpSpreadsheet/Reader/Xls.php - - - message: "#^Parameter \\#1 \\$str(ing)? of function trim expects string, mixed given\\.$#" - count: 2 - path: src/PhpSpreadsheet/Reader/Xls.php - - message: "#^Parameter \\#1 \\$type of method PhpOffice\\\\PhpSpreadsheet\\\\Cell\\\\DataValidation\\:\\:setType\\(\\) expects string, int\\|string given\\.$#" count: 1 path: src/PhpSpreadsheet/Reader/Xls.php - - - message: "#^Parameter \\#1 \\$(var|value) of function count expects array\\|Countable, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xls.php - - - - message: "#^Parameter \\#1 \\$worksheetName of method PhpOffice\\\\PhpSpreadsheet\\\\Spreadsheet\\:\\:getSheetByName\\(\\) expects string, mixed given\\.$#" - count: 2 - path: src/PhpSpreadsheet/Reader/Xls.php - - message: "#^Parameter \\#2 \\$row of method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\IReadFilter\\:\\:readCell\\(\\) expects int, string given\\.$#" count: 1 @@ -3590,11 +2475,6 @@ parameters: count: 1 path: src/PhpSpreadsheet/Reader/Xls.php - - - message: "#^Parameter \\#3 \\$subject of function str_replace expects array\\|string, mixed given\\.$#" - count: 3 - path: src/PhpSpreadsheet/Reader/Xls.php - - message: "#^Parameter \\#4 \\$endRow of static method PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\Xls\\:\\:getDistanceY\\(\\) expects int, string given\\.$#" count: 1 @@ -3655,11 +2535,6 @@ parameters: count: 1 path: src/PhpSpreadsheet/Reader/Xls/ErrorCode.php - - - message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xls\\\\Escher\\:\\:\\$object \\(PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\Escher\\|PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\Escher\\\\DgContainer\\|PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\Escher\\\\DgContainer\\\\SpgrContainer\\|PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\Escher\\\\DgContainer\\\\SpgrContainer\\\\SpContainer\\|PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\Escher\\\\DggContainer\\|PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\Escher\\\\DggContainer\\\\BstoreContainer\\|PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\Escher\\\\DggContainer\\\\BstoreContainer\\\\BSE\\) does not accept mixed\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xls/Escher.php - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xls\\\\MD5\\:\\:f\\(\\) has no return type specified\\.$#" count: 1 @@ -3691,7 +2566,7 @@ parameters: path: src/PhpSpreadsheet/Reader/Xls/MD5.php - - message: "#^Parameter \\#1 \\$(input|array) of function array_values expects array, array\\|false given\\.$#" + message: "#^Parameter \\#1 \\$input of function array_values expects array, array\\|false given\\.$#" count: 1 path: src/PhpSpreadsheet/Reader/Xls/MD5.php @@ -3720,11 +2595,6 @@ parameters: count: 1 path: src/PhpSpreadsheet/Reader/Xlsx.php - - - message: "#^Cannot access offset 0 on mixed\\.$#" - count: 5 - path: src/PhpSpreadsheet/Reader/Xlsx.php - - message: "#^Cannot access property \\$r on SimpleXMLElement\\|null\\.$#" count: 2 @@ -3780,11 +2650,6 @@ parameters: count: 2 path: src/PhpSpreadsheet/Reader/Xlsx.php - - - message: "#^Cannot use array destructuring on mixed\\.$#" - count: 2 - path: src/PhpSpreadsheet/Reader/Xlsx.php - - message: "#^Comparison operation \"\\>\" between SimpleXMLElement\\|null and 0 results in an error\\.$#" count: 1 @@ -3965,11 +2830,6 @@ parameters: count: 2 path: src/PhpSpreadsheet/Reader/Xlsx.php - - - message: "#^Parameter \\#1 \\$haystack of function strpos expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx.php - - message: "#^Parameter \\#1 \\$sizeInCm of static method PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\Font\\:\\:centimeterSizeToPixels\\(\\) expects int, string given\\.$#" count: 1 @@ -3980,11 +2840,6 @@ parameters: count: 1 path: src/PhpSpreadsheet/Reader/Xlsx.php - - - message: "#^Parameter \\#1 \\$str(ing)? of function trim expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx.php - - message: "#^Parameter \\#1 \\$worksheetName of method PhpOffice\\\\PhpSpreadsheet\\\\Spreadsheet\\:\\:getSheetByName\\(\\) expects string, array\\|string given\\.$#" count: 1 @@ -3995,11 +2850,6 @@ parameters: count: 2 path: src/PhpSpreadsheet/Reader/Xlsx.php - - - message: "#^Parameter \\#3 \\$subject of function str_replace expects array\\|string, mixed given\\.$#" - count: 2 - path: src/PhpSpreadsheet/Reader/Xlsx.php - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\AutoFilter\\:\\:readAutoFilter\\(\\) has parameter \\$autoFilterRange with no type specified\\.$#" count: 1 @@ -4035,11 +2885,6 @@ parameters: count: 1 path: src/PhpSpreadsheet/Reader/Xlsx/BaseParserClass.php - - - message: "#^Argument of an invalid type mixed supplied for foreach, only iterables are supported\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx/Chart.php - - message: "#^Cannot call method getFont\\(\\) on PhpOffice\\\\PhpSpreadsheet\\\\RichText\\\\Run\\|null\\.$#" count: 12 @@ -4215,41 +3060,6 @@ parameters: count: 1 path: src/PhpSpreadsheet/Reader/Xlsx/Chart.php - - - message: "#^Parameter \\#1 \\$showBubbleSize of method PhpOffice\\\\PhpSpreadsheet\\\\Chart\\\\Layout\\:\\:setShowBubbleSize\\(\\) expects bool, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx/Chart.php - - - - message: "#^Parameter \\#1 \\$showCategoryName of method PhpOffice\\\\PhpSpreadsheet\\\\Chart\\\\Layout\\:\\:setShowCatName\\(\\) expects bool, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx/Chart.php - - - - message: "#^Parameter \\#1 \\$showDataLabelValues of method PhpOffice\\\\PhpSpreadsheet\\\\Chart\\\\Layout\\:\\:setShowVal\\(\\) expects bool, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx/Chart.php - - - - message: "#^Parameter \\#1 \\$showLeaderLines of method PhpOffice\\\\PhpSpreadsheet\\\\Chart\\\\Layout\\:\\:setShowLeaderLines\\(\\) expects bool, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx/Chart.php - - - - message: "#^Parameter \\#1 \\$showLegendKey of method PhpOffice\\\\PhpSpreadsheet\\\\Chart\\\\Layout\\:\\:setShowLegendKey\\(\\) expects bool, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx/Chart.php - - - - message: "#^Parameter \\#1 \\$showPercentage of method PhpOffice\\\\PhpSpreadsheet\\\\Chart\\\\Layout\\:\\:setShowPercent\\(\\) expects bool, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx/Chart.php - - - - message: "#^Parameter \\#1 \\$showSeriesName of method PhpOffice\\\\PhpSpreadsheet\\\\Chart\\\\Layout\\:\\:setShowSerName\\(\\) expects bool, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx/Chart.php - - message: "#^Parameter \\#3 \\$overlay of class PhpOffice\\\\PhpSpreadsheet\\\\Chart\\\\Legend constructor expects bool, bool\\|float\\|int\\|string\\|null given\\.$#" count: 1 @@ -4335,11 +3145,6 @@ parameters: count: 1 path: src/PhpSpreadsheet/Reader/Xlsx/ColumnAndRowAttributes.php - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\ConditionalStyles\\:\\:readConditionalStyles\\(\\) has no return type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx/ConditionalStyles.php - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\ConditionalStyles\\:\\:readConditionalStyles\\(\\) has parameter \\$xmlSheet with no type specified\\.$#" count: 1 @@ -4495,16 +3300,6 @@ parameters: count: 1 path: src/PhpSpreadsheet/ReferenceHelper.php - - - message: "#^Parameter \\#1 \\$formula of method PhpOffice\\\\PhpSpreadsheet\\\\ReferenceHelper\\:\\:updateFormulaReferences\\(\\) expects string, mixed given\\.$#" - count: 2 - path: src/PhpSpreadsheet/ReferenceHelper.php - - - - message: "#^Parameter \\#1 \\$haystack of function strpos expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/ReferenceHelper.php - - message: "#^Parameter \\#1 \\$index of method PhpOffice\\\\PhpSpreadsheet\\\\Worksheet\\\\RowDimension\\:\\:setRowIndex\\(\\) expects int, string given\\.$#" count: 1 @@ -4520,11 +3315,6 @@ parameters: count: 4 path: src/PhpSpreadsheet/ReferenceHelper.php - - - message: "#^Parameter \\#3 \\$subject of function str_replace expects array\\|string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/ReferenceHelper.php - - message: "#^Parameter \\#3 \\$subject of function str_replace expects array\\|string, string\\|null given\\.$#" count: 1 @@ -4535,11 +3325,6 @@ parameters: count: 1 path: src/PhpSpreadsheet/ReferenceHelper.php - - - message: "#^Parameter \\#1 \\$text of class PhpOffice\\\\PhpSpreadsheet\\\\RichText\\\\Run constructor expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/RichText/RichText.php - - message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\RichText\\\\Run\\:\\:\\$font \\(PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\Font\\) does not accept PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\Font\\|null\\.$#" count: 1 @@ -4570,11 +3355,6 @@ parameters: count: 1 path: src/PhpSpreadsheet/Settings.php - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\Date\\:\\:stringToExcel\\(\\) should return float\\|false but returns mixed\\.$#" - count: 1 - path: src/PhpSpreadsheet/Shared/Date.php - - message: "#^Parameter \\#1 \\$excelFormatCode of static method PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\Date\\:\\:isDateTimeFormatCode\\(\\) expects string, string\\|null given\\.$#" count: 1 @@ -4601,37 +3381,37 @@ parameters: path: src/PhpSpreadsheet/Shared/Drawing.php - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\Drawing\\:\\:imagecreatefrombmp\\(\\) should return GdImage\\|resource but returns (GdImage|resource)\\|false\\.$#" + message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\Drawing\\:\\:imagecreatefrombmp\\(\\) should return GdImage\\|resource but returns resource\\|false\\.$#" count: 1 path: src/PhpSpreadsheet/Shared/Drawing.php - - message: "#^Parameter \\#1 \\$(fp|stream) of function feof expects resource, resource\\|false given\\.$#" + message: "#^Parameter \\#1 \\$fp of function feof expects resource, resource\\|false given\\.$#" count: 1 path: src/PhpSpreadsheet/Shared/Drawing.php - - message: "#^Parameter \\#1 \\$(fp|stream) of function fread expects resource, resource\\|false given\\.$#" + message: "#^Parameter \\#1 \\$fp of function fread expects resource, resource\\|false given\\.$#" count: 2 path: src/PhpSpreadsheet/Shared/Drawing.php - - message: "#^Parameter \\#1 \\$im(age)? of function imagecolorallocate expects (GdImage|resource), (GdImage|resource)\\|false given\\.$#" + message: "#^Parameter \\#1 \\$im of function imagecolorallocate expects resource, resource\\|false given\\.$#" count: 1 path: src/PhpSpreadsheet/Shared/Drawing.php - - message: "#^Parameter \\#1 \\$im(age)? of function imagesetpixel expects (GdImage|resource), (GdImage|resource)\\|false given\\.$#" + message: "#^Parameter \\#1 \\$im of function imagesetpixel expects resource, resource\\|false given\\.$#" count: 1 path: src/PhpSpreadsheet/Shared/Drawing.php - - message: "#^Parameter \\#1 \\$(x_size|width) of function imagecreatetruecolor expects int, float\\|int given\\.$#" + message: "#^Parameter \\#1 \\$x_size of function imagecreatetruecolor expects int, float\\|int given\\.$#" count: 1 path: src/PhpSpreadsheet/Shared/Drawing.php - - message: "#^Parameter \\#2 \\$(data|string) of function unpack expects string, string\\|false given\\.$#" + message: "#^Parameter \\#2 \\$data of function unpack expects string, string\\|false given\\.$#" count: 1 path: src/PhpSpreadsheet/Shared/Drawing.php @@ -4641,7 +3421,7 @@ parameters: path: src/PhpSpreadsheet/Shared/Drawing.php - - message: "#^Parameter \\#2 \\$(y_size|height) of function imagecreatetruecolor expects int, float\\|int given\\.$#" + message: "#^Parameter \\#2 \\$y_size of function imagecreatetruecolor expects int, float\\|int given\\.$#" count: 1 path: src/PhpSpreadsheet/Shared/Drawing.php @@ -4661,7 +3441,7 @@ parameters: path: src/PhpSpreadsheet/Shared/Drawing.php - - message: "#^Parameter \\#4 \\$col(or)? of function imagesetpixel expects int, int\\|false given\\.$#" + message: "#^Parameter \\#4 \\$col of function imagesetpixel expects int, int\\|false given\\.$#" count: 1 path: src/PhpSpreadsheet/Shared/Drawing.php @@ -4705,11 +3485,6 @@ parameters: count: 1 path: src/PhpSpreadsheet/Shared/Escher/DgContainer.php - - - message: "#^Cannot call method setParent\\(\\) on mixed\\.$#" - count: 1 - path: src/PhpSpreadsheet/Shared/Escher/DgContainer/SpgrContainer.php - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\Escher\\\\DgContainer\\\\SpgrContainer\\:\\:getChildren\\(\\) has no return type specified\\.$#" count: 1 @@ -4765,11 +3540,6 @@ parameters: count: 1 path: src/PhpSpreadsheet/Shared/Font.php - - - message: "#^Parameter \\#1 \\$number of function abs expects float\\|int\\|string, mixed given\\.$#" - count: 2 - path: src/PhpSpreadsheet/Shared/JAMA/EigenvalueDecomposition.php - - message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\JAMA\\\\EigenvalueDecomposition\\:\\:\\$cdivi has no type specified\\.$#" count: 1 @@ -4871,12 +3641,7 @@ parameters: path: src/PhpSpreadsheet/Shared/JAMA/Matrix.php - - message: "#^Parameter \\#1 \\$str(ing)? of function trim expects string, float\\|int given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Shared/JAMA/Matrix.php - - - - message: "#^Parameter \\#3 \\$c of method PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\JAMA\\\\Matrix\\:\\:set\\(\\) expects float\\|int\\|null, mixed given\\.$#" + message: "#^Parameter \\#1 \\$str of function trim expects string, float\\|int given\\.$#" count: 1 path: src/PhpSpreadsheet/Shared/JAMA/Matrix.php @@ -4895,21 +3660,6 @@ parameters: count: 19 path: src/PhpSpreadsheet/Shared/JAMA/Matrix.php - - - message: "#^Cannot call method getArray\\(\\) on mixed\\.$#" - count: 1 - path: src/PhpSpreadsheet/Shared/JAMA/SingularValueDecomposition.php - - - - message: "#^Cannot call method getColumnDimension\\(\\) on mixed\\.$#" - count: 1 - path: src/PhpSpreadsheet/Shared/JAMA/SingularValueDecomposition.php - - - - message: "#^Cannot call method getRowDimension\\(\\) on mixed\\.$#" - count: 1 - path: src/PhpSpreadsheet/Shared/JAMA/SingularValueDecomposition.php - - message: "#^If condition is always true\\.$#" count: 7 @@ -4920,11 +3670,6 @@ parameters: count: 4 path: src/PhpSpreadsheet/Shared/JAMA/SingularValueDecomposition.php - - - message: "#^Parameter \\#1 \\$number of function abs expects float\\|int\\|string, mixed given\\.$#" - count: 4 - path: src/PhpSpreadsheet/Shared/JAMA/utils/Maths.php - - message: "#^Cannot access offset 1 on array\\|false\\.$#" count: 1 @@ -4976,7 +3721,7 @@ parameters: path: src/PhpSpreadsheet/Shared/OLE.php - - message: "#^Parameter \\#2 \\$(data|string) of function unpack expects string, string\\|false given\\.$#" + message: "#^Parameter \\#2 \\$data of function unpack expects string, string\\|false given\\.$#" count: 3 path: src/PhpSpreadsheet/Shared/OLE.php @@ -5016,7 +3761,7 @@ parameters: path: src/PhpSpreadsheet/Shared/OLE.php - - message: "#^Parameter \\#1 \\$(var|value) of function count expects array\\|Countable, string given\\.$#" + message: "#^Parameter \\#1 \\$var of function count expects array\\|Countable, string given\\.$#" count: 1 path: src/PhpSpreadsheet/Shared/OLE/ChainedBlockStream.php @@ -5165,21 +3910,6 @@ parameters: count: 1 path: src/PhpSpreadsheet/Shared/OLERead.php - - - message: "#^Cannot access offset 'fontidx' on mixed\\.$#" - count: 1 - path: src/PhpSpreadsheet/Shared/StringHelper.php - - - - message: "#^Cannot access offset 'strlen' on mixed\\.$#" - count: 1 - path: src/PhpSpreadsheet/Shared/StringHelper.php - - - - message: "#^Cannot cast mixed to string\\.$#" - count: 1 - path: src/PhpSpreadsheet/Shared/StringHelper.php - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\StringHelper\\:\\:formatNumber\\(\\) should return string but returns array\\|string\\.$#" count: 1 @@ -5225,11 +3955,6 @@ parameters: count: 1 path: src/PhpSpreadsheet/Shared/StringHelper.php - - - message: "#^Static property PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\StringHelper\\:\\:\\$isIconvEnabled \\(bool\\) in isset\\(\\) is not nullable\\.$#" - count: 1 - path: src/PhpSpreadsheet/Shared/StringHelper.php - - message: "#^Static property PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\StringHelper\\:\\:\\$thousandsSeparator \\(string\\) in isset\\(\\) is not nullable\\.$#" count: 1 @@ -5381,15 +4106,10 @@ parameters: path: src/PhpSpreadsheet/Shared/Trend/PolynomialBestFit.php - - message: "#^Parameter \\#2 \\.\\.\\.\\$(args|arrays) of function array_merge expects array, float given\\.$#" + message: "#^Parameter \\#2 \\.\\.\\.\\$args of function array_merge expects array, float given\\.$#" count: 1 path: src/PhpSpreadsheet/Shared/Trend/PolynomialBestFit.php - - - message: "#^Array \\(array\\\\) does not accept object\\.$#" - count: 1 - path: src/PhpSpreadsheet/Shared/Trend/Trend.php - - message: "#^Call to an undefined method object\\:\\:getGoodnessOfFit\\(\\)\\.$#" count: 1 @@ -5445,11 +4165,6 @@ parameters: count: 1 path: src/PhpSpreadsheet/Shared/XMLWriter.php - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\Xls\\:\\:sizeCol\\(\\) should return int but returns mixed\\.$#" - count: 1 - path: src/PhpSpreadsheet/Shared/Xls.php - - message: "#^Call to function is_array\\(\\) with string will always evaluate to false\\.$#" count: 1 @@ -5460,21 +4175,11 @@ parameters: count: 1 path: src/PhpSpreadsheet/Spreadsheet.php - - - message: "#^Parameter \\#1 \\$path of function pathinfo expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Spreadsheet.php - - message: "#^Parameter \\#1 \\$worksheet of method PhpOffice\\\\PhpSpreadsheet\\\\Spreadsheet\\:\\:getIndex\\(\\) expects PhpOffice\\\\PhpSpreadsheet\\\\Worksheet\\\\Worksheet, PhpOffice\\\\PhpSpreadsheet\\\\Worksheet\\\\Worksheet\\|null given\\.$#" count: 1 path: src/PhpSpreadsheet/Spreadsheet.php - - - message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Spreadsheet\\:\\:\\$ribbonXMLData \\(array\\{target\\: string, data\\: string\\}\\|null\\) does not accept array\\{target\\: mixed, data\\: mixed\\}\\.$#" - count: 1 - path: src/PhpSpreadsheet/Spreadsheet.php - - message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Spreadsheet\\:\\:\\$workbookViewVisibilityValues has no type specified\\.$#" count: 1 @@ -5670,6 +4375,11 @@ parameters: count: 1 path: src/PhpSpreadsheet/Style/ConditionalFormatting/ConditionalFormattingRuleExtension.php + - + message: "#^Parameter \\#1 \\$conditions of method PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\Conditional\\:\\:setConditions\\(\\) expects array\\\\|bool\\|float\\|int\\|string, array\\ given\\.$#" + count: 1 + path: src/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/CellValue.php + - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\NumberFormat\\\\DateFormatter\\:\\:escapeQuotesCallback\\(\\) has parameter \\$matches with no type specified\\.$#" count: 1 @@ -5690,23 +4400,13 @@ parameters: count: 1 path: src/PhpSpreadsheet/Style/NumberFormat/DateFormatter.php - - - message: "#^Parameter \\#2 \\$callback of function preg_replace_callback expects callable\\(\\)\\: mixed, array\\{'self', 'escapeQuotesCallback'\\} given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Style/NumberFormat/DateFormatter.php - - - - message: "#^Parameter \\#2 \\$callback of function preg_replace_callback expects callable\\(\\)\\: mixed, array\\{'self', 'setLowercaseCallback'\\} given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Style/NumberFormat/DateFormatter.php - - message: "#^Parameter \\#2 \\$replace of function str_replace expects array\\|string, int given\\.$#" count: 1 path: src/PhpSpreadsheet/Style/NumberFormat/DateFormatter.php - - message: "#^Parameter \\#2 \\$str(ing)? of function explode expects string, string\\|null given\\.$#" + message: "#^Parameter \\#2 \\$str of function explode expects string, string\\|null given\\.$#" count: 1 path: src/PhpSpreadsheet/Style/NumberFormat/DateFormatter.php @@ -5715,11 +4415,6 @@ parameters: count: 1 path: src/PhpSpreadsheet/Style/NumberFormat/DateFormatter.php - - - message: "#^Parameter \\#3 \\$subject of function preg_replace_callback expects array\\|string, string\\|null given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Style/NumberFormat/DateFormatter.php - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\NumberFormat\\\\Formatter\\:\\:splitFormat\\(\\) has no return type specified\\.$#" count: 1 @@ -5770,11 +4465,6 @@ parameters: count: 1 path: src/PhpSpreadsheet/Style/NumberFormat/Formatter.php - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\NumberFormat\\\\Formatter\\:\\:toFormattedString\\(\\) should return string but returns mixed\\.$#" - count: 1 - path: src/PhpSpreadsheet/Style/NumberFormat/Formatter.php - - message: "#^Parameter \\#2 \\$subject of function preg_split expects string, string\\|null given\\.$#" count: 1 @@ -5785,11 +4475,6 @@ parameters: count: 1 path: src/PhpSpreadsheet/Style/NumberFormat/Formatter.php - - - message: "#^Cannot cast mixed to float\\.$#" - count: 1 - path: src/PhpSpreadsheet/Style/NumberFormat/FractionFormatter.php - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\NumberFormat\\\\PercentageFormatter\\:\\:format\\(\\) has parameter \\$value with no type specified\\.$#" count: 1 @@ -5800,106 +4485,6 @@ parameters: count: 1 path: src/PhpSpreadsheet/Style/NumberFormat/PercentageFormatter.php - - - message: "#^Argument of an invalid type mixed supplied for foreach, only iterables are supported\\.$#" - count: 1 - path: src/PhpSpreadsheet/Worksheet/AutoFilter.php - - - - message: "#^Cannot access offset 'date' on mixed\\.$#" - count: 1 - path: src/PhpSpreadsheet/Worksheet/AutoFilter.php - - - - message: "#^Cannot access offset 'dateTime' on mixed\\.$#" - count: 1 - path: src/PhpSpreadsheet/Worksheet/AutoFilter.php - - - - message: "#^Cannot access offset 'time' on mixed\\.$#" - count: 1 - path: src/PhpSpreadsheet/Worksheet/AutoFilter.php - - - - message: "#^Cannot use array destructuring on mixed\\.$#" - count: 1 - path: src/PhpSpreadsheet/Worksheet/AutoFilter.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Worksheet\\\\AutoFilter\\:\\:filterTestInDateGroupSet\\(\\) should return bool but returns mixed\\.$#" - count: 1 - path: src/PhpSpreadsheet/Worksheet/AutoFilter.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Worksheet\\\\AutoFilter\\:\\:filterTestInSimpleDataSet\\(\\) should return bool but returns mixed\\.$#" - count: 1 - path: src/PhpSpreadsheet/Worksheet/AutoFilter.php - - - - message: "#^Parameter \\#1 \\$haystack of function strpos expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Worksheet/AutoFilter.php - - - - message: "#^Parameter \\#1 \\$range of static method PhpOffice\\\\PhpSpreadsheet\\\\Cell\\\\Coordinate\\:\\:rangeBoundaries\\(\\) expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Worksheet/AutoFilter.php - - - - message: "#^Parameter \\#1 \\$string of function strlen expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Worksheet/AutoFilter.php - - - - message: "#^Parameter \\#1 \\$visible of method PhpOffice\\\\PhpSpreadsheet\\\\Worksheet\\\\Dimension\\:\\:setVisible\\(\\) expects bool, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Worksheet/AutoFilter.php - - - - message: "#^Parameter \\#2 \\$haystack of function in_array expects array, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Worksheet/AutoFilter.php - - - - message: "#^Parameter \\#3 \\$length of function array_slice expects int\\|null, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Worksheet/AutoFilter.php - - - - message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Worksheet\\\\AutoFilter\\:\\:\\$range \\(string\\) does not accept mixed\\.$#" - count: 1 - path: src/PhpSpreadsheet/Worksheet/AutoFilter.php - - - - message: "#^Argument of an invalid type mixed supplied for foreach, only iterables are supported\\.$#" - count: 1 - path: src/PhpSpreadsheet/Worksheet/AutoFilter/Column.php - - - - message: "#^Array \\(array\\\\) does not accept mixed\\.$#" - count: 1 - path: src/PhpSpreadsheet/Worksheet/AutoFilter/Column.php - - - - message: "#^Cannot call method setParent\\(\\) on mixed\\.$#" - count: 1 - path: src/PhpSpreadsheet/Worksheet/AutoFilter/Column.php - - - - message: "#^Cannot clone non\\-object variable \\$v of type mixed\\.$#" - count: 1 - path: src/PhpSpreadsheet/Worksheet/AutoFilter/Column.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Worksheet\\\\AutoFilter\\\\Column\\:\\:getAttribute\\(\\) should return int\\|string\\|null but returns mixed\\.$#" - count: 1 - path: src/PhpSpreadsheet/Worksheet/AutoFilter/Column.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Worksheet\\\\AutoFilter\\\\Column\\:\\:getAttributes\\(\\) should return array\\ but returns array\\.$#" - count: 1 - path: src/PhpSpreadsheet/Worksheet/AutoFilter/Column.php - - message: "#^Cannot call method getCell\\(\\) on PhpOffice\\\\PhpSpreadsheet\\\\Worksheet\\\\Worksheet\\|null\\.$#" count: 1 @@ -5946,7 +4531,7 @@ parameters: path: src/PhpSpreadsheet/Worksheet/PageSetup.php - - message: "#^Parameter \\#2 \\$str(ing)? of function explode expects string, string\\|null given\\.$#" + message: "#^Parameter \\#2 \\$str of function explode expects string, string\\|null given\\.$#" count: 5 path: src/PhpSpreadsheet/Worksheet/PageSetup.php @@ -5980,16 +4565,6 @@ parameters: count: 1 path: src/PhpSpreadsheet/Worksheet/SheetView.php - - - message: "#^Cannot access offset 0 on mixed\\.$#" - count: 2 - path: src/PhpSpreadsheet/Worksheet/Worksheet.php - - - - message: "#^Cannot access offset 1 on mixed\\.$#" - count: 1 - path: src/PhpSpreadsheet/Worksheet/Worksheet.php - - message: "#^Cannot call method getCalculatedValue\\(\\) on PhpOffice\\\\PhpSpreadsheet\\\\Cell\\\\Cell\\|null\\.$#" count: 1 @@ -6051,7 +4626,7 @@ parameters: path: src/PhpSpreadsheet/Worksheet/Worksheet.php - - message: "#^Parameter \\#1 \\$(input|string|array) of function array_splice expects array, ArrayObject\\ given\\.$#" + message: "#^Parameter \\#1 \\$input of function array_splice expects array, ArrayObject\\ given\\.$#" count: 1 path: src/PhpSpreadsheet/Worksheet/Worksheet.php @@ -6062,16 +4637,11 @@ parameters: - message: "#^Parameter \\#1 \\$row of method PhpOffice\\\\PhpSpreadsheet\\\\Collection\\\\Cells\\:\\:removeRow\\(\\) expects string, int given\\.$#" - count: 2 - path: src/PhpSpreadsheet/Worksheet/Worksheet.php - - - - message: "#^Parameter \\#1 \\$str(ing)? of function strtoupper expects string, mixed given\\.$#" count: 1 path: src/PhpSpreadsheet/Worksheet/Worksheet.php - - message: "#^Parameter \\#1 \\$worksheetName of method PhpOffice\\\\PhpSpreadsheet\\\\Spreadsheet\\:\\:getSheetByName\\(\\) expects string, mixed given\\.$#" + message: "#^Parameter \\#1 \\$row of method PhpOffice\\\\PhpSpreadsheet\\\\Collection\\\\Cells\\:\\:removeRow\\(\\) expects string, int\\<1, max\\> given\\.$#" count: 1 path: src/PhpSpreadsheet/Worksheet/Worksheet.php @@ -6081,7 +4651,7 @@ parameters: path: src/PhpSpreadsheet/Worksheet/Worksheet.php - - message: "#^Parameter \\#2 \\$(start|offset) of function substr expects int, int(\\<0, max\\>)?\\|false given\\.$#" + message: "#^Parameter \\#2 \\$start of function substr expects int, int\\<0, max\\>\\|false given\\.$#" count: 2 path: src/PhpSpreadsheet/Worksheet/Worksheet.php @@ -6110,11 +4680,6 @@ parameters: count: 1 path: src/PhpSpreadsheet/Worksheet/Worksheet.php - - - message: "#^Cannot cast mixed to string\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Csv.php - - message: "#^Call to function array_key_exists\\(\\) with int and array\\{none\\: 'none', dashDot\\: '1px dashed', dashDotDot\\: '1px dotted', dashed\\: '1px dashed', dotted\\: '1px dotted', double\\: '3px double', hair\\: '1px solid', medium\\: '2px solid', \\.\\.\\.\\} will always evaluate to false\\.$#" count: 1 @@ -6411,12 +4976,12 @@ parameters: path: src/PhpSpreadsheet/Writer/Html.php - - message: "#^Parameter \\#1 \\$im(age)? of function imagepng expects (GdImage|resource), GdImage\\|resource given\\.$#" + message: "#^Parameter \\#1 \\$im of function imagepng expects resource, GdImage\\|resource given\\.$#" count: 1 path: src/PhpSpreadsheet/Writer/Html.php - - message: "#^Parameter \\#1 \\$str(ing)? of function base64_encode expects string, string\\|false given\\.$#" + message: "#^Parameter \\#1 \\$str of function base64_encode expects string, string\\|false given\\.$#" count: 2 path: src/PhpSpreadsheet/Writer/Html.php @@ -6465,11 +5030,6 @@ parameters: count: 1 path: src/PhpSpreadsheet/Writer/Ods/Content.php - - - message: "#^Parameter \\#2 \\$content of method XMLWriter\\:\\:writeElement\\(\\) expects string\\|null, mixed given\\.$#" - count: 4 - path: src/PhpSpreadsheet/Writer/Ods/Content.php - - message: "#^Parameter \\#2 \\$value of method XMLWriter\\:\\:writeAttribute\\(\\) expects string, int given\\.$#" count: 4 @@ -6480,11 +5040,6 @@ parameters: count: 3 path: src/PhpSpreadsheet/Writer/Ods/Content.php - - - message: "#^Parameter \\#2 \\$value of method XMLWriter\\:\\:writeAttribute\\(\\) expects string, mixed given\\.$#" - count: 3 - path: src/PhpSpreadsheet/Writer/Ods/Content.php - - message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Ods\\\\Content\\:\\:\\$formulaConvertor has no type specified\\.$#" count: 1 @@ -6495,16 +5050,6 @@ parameters: count: 1 path: src/PhpSpreadsheet/Writer/Ods/Formula.php - - - message: "#^Parameter \\#1 \\$date of static method PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\Date\\:\\:dateTimeFromTimestamp\\(\\) expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Ods/Meta.php - - - - message: "#^Parameter \\#1 \\$rawTextData of method PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\XMLWriter\\:\\:writeRawData\\(\\) expects array\\\\|string\\|null, mixed given\\.$#" - count: 2 - path: src/PhpSpreadsheet/Writer/Ods/Meta.php - - message: "#^Parameter \\#1 \\$content of method XMLWriter\\:\\:text\\(\\) expects string, int given\\.$#" count: 2 @@ -6566,12 +5111,12 @@ parameters: path: src/PhpSpreadsheet/Writer/Xls.php - - message: "#^Parameter \\#1 \\$im(age)? of function imagepng expects (GdImage|resource), GdImage\\|resource given\\.$#" + message: "#^Parameter \\#1 \\$im of function imagepng expects resource, GdImage\\|resource given\\.$#" count: 1 path: src/PhpSpreadsheet/Writer/Xls.php - - message: "#^Parameter \\#1 \\$im(age)? of function imagepng expects (GdImage|resource), (GdImage|resource)\\|false given\\.$#" + message: "#^Parameter \\#1 \\$im of function imagepng expects resource, resource\\|false given\\.$#" count: 1 path: src/PhpSpreadsheet/Writer/Xls.php @@ -6640,11 +5185,6 @@ parameters: count: 1 path: src/PhpSpreadsheet/Writer/Xls/Font.php - - - message: "#^Cannot use array destructuring on mixed\\.$#" - count: 2 - path: src/PhpSpreadsheet/Writer/Xls/Parser.php - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Xls\\\\Parser\\:\\:advance\\(\\) has no return type specified\\.$#" count: 1 @@ -6665,76 +5205,6 @@ parameters: count: 7 path: src/PhpSpreadsheet/Writer/Xls/Parser.php - - - message: "#^Parameter \\#1 \\$cell of method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Xls\\\\Parser\\:\\:cellToPackedRowcol\\(\\) expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xls/Parser.php - - - - message: "#^Parameter \\#1 \\$cell of method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Xls\\\\Parser\\:\\:convertRef2d\\(\\) expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xls/Parser.php - - - - message: "#^Parameter \\#1 \\$cell of method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Xls\\\\Parser\\:\\:convertRef3d\\(\\) expects string, mixed given\\.$#" - count: 2 - path: src/PhpSpreadsheet/Writer/Xls/Parser.php - - - - message: "#^Parameter \\#1 \\$errorCode of method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Xls\\\\Parser\\:\\:convertError\\(\\) expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xls/Parser.php - - - - message: "#^Parameter \\#1 \\$ext_ref of method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Xls\\\\Parser\\:\\:getRefIndex\\(\\) expects string, mixed given\\.$#" - count: 2 - path: src/PhpSpreadsheet/Writer/Xls/Parser.php - - - - message: "#^Parameter \\#1 \\$haystack of function substr_count expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xls/Parser.php - - - - message: "#^Parameter \\#1 \\$name of method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Xls\\\\Parser\\:\\:convertDefinedName\\(\\) expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xls/Parser.php - - - - message: "#^Parameter \\#1 \\$range of method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Xls\\\\Parser\\:\\:convertRange2d\\(\\) expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xls/Parser.php - - - - message: "#^Parameter \\#1 \\$str(ing)? of function strrev expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xls/Parser.php - - - - message: "#^Parameter \\#1 \\$string of function substr expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xls/Parser.php - - - - message: "#^Parameter \\#1 \\$string of method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Xls\\\\Parser\\:\\:convertString\\(\\) expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xls/Parser.php - - - - message: "#^Parameter \\#1 \\$token of method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Xls\\\\Parser\\:\\:convertRange3d\\(\\) expects string, mixed given\\.$#" - count: 2 - path: src/PhpSpreadsheet/Writer/Xls/Parser.php - - - - message: "#^Parameter \\#2 \\$str(ing)? of function explode expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xls/Parser.php - - - - message: "#^Parameter \\#2 \\$subject of function preg_match expects string, mixed given\\.$#" - count: 20 - path: src/PhpSpreadsheet/Writer/Xls/Parser.php - - message: "#^Parameter \\#3 \\$subject of function preg_replace expects array\\|string, string\\|null given\\.$#" count: 1 @@ -6745,16 +5215,6 @@ parameters: count: 1 path: src/PhpSpreadsheet/Writer/Xls/Parser.php - - - message: "#^Part \\$token \\(mixed\\) of encapsed string cannot be cast to string\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xls/Parser.php - - - - message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Xls\\\\Parser\\:\\:\\$parseTree \\(string\\) does not accept mixed\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xls/Parser.php - - message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Xls\\\\Parser\\:\\:\\$spreadsheet has no type specified\\.$#" count: 1 @@ -6835,23 +5295,13 @@ parameters: count: 1 path: src/PhpSpreadsheet/Writer/Xls/Worksheet.php - - - message: "#^Parameter \\#1 \\$bitmap of method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Xls\\\\Worksheet\\:\\:processBitmap\\(\\) expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xls/Worksheet.php - - message: "#^Parameter \\#1 \\$coordinates of static method PhpOffice\\\\PhpSpreadsheet\\\\Cell\\\\Coordinate\\:\\:indexesFromString\\(\\) expects string, string\\|null given\\.$#" count: 1 path: src/PhpSpreadsheet/Writer/Xls/Worksheet.php - - message: "#^Parameter \\#1 \\$errorCode of static method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Xls\\\\ErrorCode\\:\\:error\\(\\) expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xls/Worksheet.php - - - - message: "#^Parameter \\#1 \\$im(age)? of function imagecolorat expects (GdImage|resource), GdImage\\|resource given\\.$#" + message: "#^Parameter \\#1 \\$im of function imagecolorat expects resource, GdImage\\|resource given\\.$#" count: 1 path: src/PhpSpreadsheet/Writer/Xls/Worksheet.php @@ -6866,12 +5316,12 @@ parameters: path: src/PhpSpreadsheet/Writer/Xls/Worksheet.php - - message: "#^Parameter \\#2 \\$col(or)? of function imagecolorsforindex expects int, int\\|false given\\.$#" + message: "#^Parameter \\#2 \\$col of function imagecolorsforindex expects int, int\\|false given\\.$#" count: 1 path: src/PhpSpreadsheet/Writer/Xls/Worksheet.php - - message: "#^Parameter \\#2 \\$(data|string) of function unpack expects string, string\\|false given\\.$#" + message: "#^Parameter \\#2 \\$data of function unpack expects string, string\\|false given\\.$#" count: 1 path: src/PhpSpreadsheet/Writer/Xls/Worksheet.php @@ -6881,7 +5331,7 @@ parameters: path: src/PhpSpreadsheet/Writer/Xls/Worksheet.php - - message: "#^Parameter \\#2 \\$(pieces|array) of function implode expects array(\\|null)?, array\\\\|false given\\.$#" + message: "#^Parameter \\#2 \\$pieces of function implode expects array, array\\\\|false given\\.$#" count: 1 path: src/PhpSpreadsheet/Writer/Xls/Worksheet.php @@ -6895,31 +5345,11 @@ parameters: count: 1 path: src/PhpSpreadsheet/Writer/Xls/Worksheet.php - - - message: "#^Parameter \\#3 \\$formula of method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Xls\\\\Worksheet\\:\\:writeFormula\\(\\) expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xls/Worksheet.php - - - - message: "#^Parameter \\#3 \\$num of method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Xls\\\\Worksheet\\:\\:writeNumber\\(\\) expects float, mixed given\\.$#" - count: 2 - path: src/PhpSpreadsheet/Writer/Xls/Worksheet.php - - - - message: "#^Parameter \\#3 \\$str of method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Xls\\\\Worksheet\\:\\:writeString\\(\\) expects string, mixed given\\.$#" - count: 3 - path: src/PhpSpreadsheet/Writer/Xls/Worksheet.php - - message: "#^Parameter \\#3 \\$subject of function preg_replace expects array\\|string, string\\|null given\\.$#" count: 2 path: src/PhpSpreadsheet/Writer/Xls/Worksheet.php - - - message: "#^Parameter \\#3 \\$value of method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Xls\\\\Worksheet\\:\\:writeBoolErr\\(\\) expects int, mixed given\\.$#" - count: 2 - path: src/PhpSpreadsheet/Writer/Xls/Worksheet.php - - message: "#^Parameter \\#4 \\$isError of method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Xls\\\\Worksheet\\:\\:writeBoolErr\\(\\) expects bool, int given\\.$#" count: 3 @@ -6986,7 +5416,7 @@ parameters: path: src/PhpSpreadsheet/Writer/Xlsx.php - - message: "#^Parameter \\#1 \\$(function|callback) of function call_user_func expects callable\\(\\)\\: mixed, string given\\.$#" + message: "#^Parameter \\#1 \\$function of function call_user_func expects callable\\(\\)\\: mixed, string given\\.$#" count: 1 path: src/PhpSpreadsheet/Writer/Xlsx.php @@ -7010,11 +5440,6 @@ parameters: count: 1 path: src/PhpSpreadsheet/Writer/Xlsx.php - - - message: "#^Cannot access offset int on mixed\\.$#" - count: 2 - path: src/PhpSpreadsheet/Writer/Xlsx/Chart.php - - message: "#^Cannot call method getDataValues\\(\\) on PhpOffice\\\\PhpSpreadsheet\\\\Chart\\\\DataSeriesValues\\|false\\.$#" count: 1 @@ -7031,7 +5456,7 @@ parameters: path: src/PhpSpreadsheet/Writer/Xlsx/Chart.php - - message: "#^Parameter \\#1 \\$plotSeriesValues of method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Xlsx\\\\Chart\\:\\:writeBubbles\\(\\) expects PhpOffice\\\\PhpSpreadsheet\\\\Chart\\\\DataSeriesValues|null, PhpOffice\\\\PhpSpreadsheet\\\\Chart\\\\DataSeriesValues\\|false given\\.$#" + message: "#^Parameter \\#1 \\$plotSeriesValues of method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Xlsx\\\\Chart\\:\\:writeBubbles\\(\\) expects PhpOffice\\\\PhpSpreadsheet\\\\Chart\\\\DataSeriesValues\\|null, PhpOffice\\\\PhpSpreadsheet\\\\Chart\\\\DataSeriesValues\\|false given\\.$#" count: 1 path: src/PhpSpreadsheet/Writer/Xlsx/Chart.php @@ -7040,11 +5465,6 @@ parameters: count: 1 path: src/PhpSpreadsheet/Writer/Xlsx/Chart.php - - - message: "#^Parameter \\#1 \\$rawTextData of method PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\XMLWriter\\:\\:writeRawData\\(\\) expects array\\\\|string\\|null, mixed given\\.$#" - count: 2 - path: src/PhpSpreadsheet/Writer/Xlsx/Chart.php - - message: "#^Parameter \\#2 \\$value of method XMLWriter\\:\\:writeAttribute\\(\\) expects string, array\\|int\\|string given\\.$#" count: 8 @@ -7145,11 +5565,6 @@ parameters: count: 2 path: src/PhpSpreadsheet/Writer/Xlsx/Comments.php - - - message: "#^Cannot use array destructuring on mixed\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xlsx/DefinedNames.php - - message: "#^Expression on left side of \\?\\? is not nullable\\.$#" count: 1 @@ -7160,23 +5575,13 @@ parameters: count: 1 path: src/PhpSpreadsheet/Writer/Xlsx/DocProps.php - - - message: "#^Parameter \\#2 \\$content of method XMLWriter\\:\\:writeElement\\(\\) expects string\\|null, mixed given\\.$#" - count: 3 - path: src/PhpSpreadsheet/Writer/Xlsx/DocProps.php - - message: "#^Parameter \\#2 \\$value of method XMLWriter\\:\\:writeAttribute\\(\\) expects string, int given\\.$#" count: 2 path: src/PhpSpreadsheet/Writer/Xlsx/DocProps.php - - message: "#^Part \\$propertyValue \\(mixed\\) of encapsed string cannot be cast to string\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xlsx/DocProps.php - - - - message: "#^Parameter \\#1 \\$index of method PhpOffice\\\\PhpSpreadsheet\\\\Worksheet\\\\Worksheet\\:\\:getChartByIndex\\(\\) expects string, int given\\.$#" + message: "#^Parameter \\#1 \\$index of method PhpOffice\\\\PhpSpreadsheet\\\\Worksheet\\\\Worksheet\\:\\:getChartByIndex\\(\\) expects string, int\\<0, max\\> given\\.$#" count: 1 path: src/PhpSpreadsheet/Writer/Xlsx/Drawing.php @@ -7275,11 +5680,6 @@ parameters: count: 1 path: src/PhpSpreadsheet/Writer/Xlsx/StringTable.php - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Xlsx\\\\StringTable\\:\\:createStringTable\\(\\) should return array\\ but returns array\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xlsx/StringTable.php - - message: "#^Parameter \\#1 \\$text of method PhpOffice\\\\PhpSpreadsheet\\\\RichText\\\\RichText\\:\\:createTextRun\\(\\) expects string, string\\|null given\\.$#" count: 1 @@ -7375,16 +5775,6 @@ parameters: count: 7 path: src/PhpSpreadsheet/Writer/Xlsx/Workbook.php - - - message: "#^Cannot cast mixed to string\\.$#" - count: 4 - path: src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php - - - - message: "#^Cannot use array destructuring on mixed\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php - - message: "#^Expression on left side of \\?\\? is not nullable\\.$#" count: 1 @@ -7416,43 +5806,18 @@ parameters: path: src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php - - message: "#^Offset int on array\\\\> in isset\\(\\) does not exist\\.$#" + message: "#^Offset int\\<1, max\\> on array\\\\> in isset\\(\\) does not exist\\.$#" count: 2 path: src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php - - - message: "#^Parameter \\#1 \\$content of method XMLWriter\\:\\:text\\(\\) expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php - - - - message: "#^Parameter \\#1 \\$string of function substr expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php - - - - message: "#^Parameter \\#2 \\$cellValue of method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Xlsx\\\\Worksheet\\:\\:writeCellFormula\\(\\) expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php - - - - message: "#^Parameter \\#2 \\$cellValue of method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Xlsx\\\\Worksheet\\:\\:writeCellNumeric\\(\\) expects float\\|int, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php - - message: "#^Parameter \\#2 \\$content of method XMLWriter\\:\\:writeElement\\(\\) expects string\\|null, int\\|string given\\.$#" count: 1 path: src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php - - - message: "#^Parameter \\#2 \\$content of method XMLWriter\\:\\:writeElement\\(\\) expects string\\|null, mixed given\\.$#" - count: 2 - path: src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php - - message: "#^Parameter \\#2 \\$value of method XMLWriter\\:\\:writeAttribute\\(\\) expects string, int given\\.$#" - count: 19 + count: 15 path: src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php - @@ -7462,7 +5827,7 @@ parameters: - message: "#^Parameter \\#2 \\$value of method XMLWriter\\:\\:writeAttribute\\(\\) expects string, int\\<1, max\\> given\\.$#" - count: 7 + count: 9 path: src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php - @@ -7470,36 +5835,11 @@ parameters: count: 1 path: src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php - - - message: "#^Parameter \\#2 \\$value of method XMLWriter\\:\\:writeAttribute\\(\\) expects string, mixed given\\.$#" - count: 3 - path: src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php - - message: "#^Parameter \\#2 \\$value of method XMLWriter\\:\\:writeAttribute\\(\\) expects string, string\\|null given\\.$#" count: 1 path: src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php - - - message: "#^Parameter \\#3 \\$cellValue of method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Xlsx\\\\Worksheet\\:\\:writeCellBoolean\\(\\) expects bool, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php - - - - message: "#^Parameter \\#3 \\$cellValue of method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Xlsx\\\\Worksheet\\:\\:writeCellError\\(\\) expects string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php - - - - message: "#^Parameter \\#3 \\$cellValue of method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Xlsx\\\\Worksheet\\:\\:writeCellInlineStr\\(\\) expects PhpOffice\\\\PhpSpreadsheet\\\\RichText\\\\RichText\\|string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php - - - - message: "#^Parameter \\#3 \\$cellValue of method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Xlsx\\\\Worksheet\\:\\:writeCellString\\(\\) expects PhpOffice\\\\PhpSpreadsheet\\\\RichText\\\\RichText\\|string, mixed given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php - - message: "#^Parameter \\#3 \\$stringTable of method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Xlsx\\\\Worksheet\\:\\:writeSheetData\\(\\) expects array\\, array\\\\|null given\\.$#" count: 1 @@ -7520,711 +5860,11 @@ parameters: count: 1 path: src/PhpSpreadsheet/Writer/Xlsx/Xlfn.php - - - message: "#^Parameter \\#1 \\$formula of method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Calculation\\:\\:_calculateFormulaValue\\(\\) expects string, mixed given\\.$#" - count: 2 - path: tests/PhpSpreadsheetTests/Calculation/CalculationTest.php - - - - message: "#^Parameter \\#1 \\$source of method PhpOffice\\\\PhpSpreadsheet\\\\Worksheet\\\\Worksheet\\:\\:fromArray\\(\\) expects array, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/CalculationTest.php - - message: "#^Unreachable statement \\- code above always terminates\\.$#" count: 1 path: tests/PhpSpreadsheetTests/Calculation/Engine/RangeTest.php - - - message: "#^Parameter \\#1 \\$database of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Database\\:\\:DAVERAGE\\(\\) expects array, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Database/DAverageTest.php - - - - message: "#^Parameter \\#2 \\$field of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Database\\:\\:DAVERAGE\\(\\) expects int\\|string, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Database/DAverageTest.php - - - - message: "#^Parameter \\#3 \\$criteria of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Database\\:\\:DAVERAGE\\(\\) expects array, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Database/DAverageTest.php - - - - message: "#^Parameter \\#1 \\$database of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Database\\:\\:DCOUNTA\\(\\) expects array, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Database/DCountATest.php - - - - message: "#^Parameter \\#2 \\$field of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Database\\:\\:DCOUNTA\\(\\) expects int\\|string\\|null, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Database/DCountATest.php - - - - message: "#^Parameter \\#3 \\$criteria of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Database\\:\\:DCOUNTA\\(\\) expects array, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Database/DCountATest.php - - - - message: "#^Parameter \\#1 \\$database of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Database\\:\\:DCOUNT\\(\\) expects array, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Database/DCountTest.php - - - - message: "#^Parameter \\#2 \\$field of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Database\\:\\:DCOUNT\\(\\) expects int\\|string\\|null, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Database/DCountTest.php - - - - message: "#^Parameter \\#3 \\$criteria of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Database\\:\\:DCOUNT\\(\\) expects array, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Database/DCountTest.php - - - - message: "#^Parameter \\#1 \\$database of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Database\\:\\:DGET\\(\\) expects array, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Database/DGetTest.php - - - - message: "#^Parameter \\#2 \\$field of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Database\\:\\:DGET\\(\\) expects int\\|string, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Database/DGetTest.php - - - - message: "#^Parameter \\#3 \\$criteria of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Database\\:\\:DGET\\(\\) expects array, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Database/DGetTest.php - - - - message: "#^Parameter \\#1 \\$database of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Database\\:\\:DMAX\\(\\) expects array, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Database/DMaxTest.php - - - - message: "#^Parameter \\#2 \\$field of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Database\\:\\:DMAX\\(\\) expects int\\|string, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Database/DMaxTest.php - - - - message: "#^Parameter \\#3 \\$criteria of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Database\\:\\:DMAX\\(\\) expects array, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Database/DMaxTest.php - - - - message: "#^Parameter \\#1 \\$database of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Database\\:\\:DMIN\\(\\) expects array, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Database/DMinTest.php - - - - message: "#^Parameter \\#2 \\$field of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Database\\:\\:DMIN\\(\\) expects int\\|string, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Database/DMinTest.php - - - - message: "#^Parameter \\#3 \\$criteria of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Database\\:\\:DMIN\\(\\) expects array, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Database/DMinTest.php - - - - message: "#^Parameter \\#1 \\$database of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Database\\:\\:DPRODUCT\\(\\) expects array, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Database/DProductTest.php - - - - message: "#^Parameter \\#2 \\$field of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Database\\:\\:DPRODUCT\\(\\) expects int\\|string, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Database/DProductTest.php - - - - message: "#^Parameter \\#3 \\$criteria of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Database\\:\\:DPRODUCT\\(\\) expects array, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Database/DProductTest.php - - - - message: "#^Parameter \\#1 \\$database of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Database\\:\\:DSTDEVP\\(\\) expects array, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Database/DStDevPTest.php - - - - message: "#^Parameter \\#2 \\$field of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Database\\:\\:DSTDEVP\\(\\) expects int\\|string, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Database/DStDevPTest.php - - - - message: "#^Parameter \\#3 \\$criteria of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Database\\:\\:DSTDEVP\\(\\) expects array, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Database/DStDevPTest.php - - - - message: "#^Parameter \\#1 \\$database of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Database\\:\\:DSTDEV\\(\\) expects array, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Database/DStDevTest.php - - - - message: "#^Parameter \\#2 \\$field of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Database\\:\\:DSTDEV\\(\\) expects int\\|string, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Database/DStDevTest.php - - - - message: "#^Parameter \\#3 \\$criteria of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Database\\:\\:DSTDEV\\(\\) expects array, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Database/DStDevTest.php - - - - message: "#^Parameter \\#1 \\$database of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Database\\:\\:DSUM\\(\\) expects array, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Database/DSumTest.php - - - - message: "#^Parameter \\#2 \\$field of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Database\\:\\:DSUM\\(\\) expects int\\|string, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Database/DSumTest.php - - - - message: "#^Parameter \\#3 \\$criteria of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Database\\:\\:DSUM\\(\\) expects array, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Database/DSumTest.php - - - - message: "#^Parameter \\#1 \\$database of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Database\\:\\:DVARP\\(\\) expects array, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Database/DVarPTest.php - - - - message: "#^Parameter \\#2 \\$field of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Database\\:\\:DVARP\\(\\) expects int\\|string, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Database/DVarPTest.php - - - - message: "#^Parameter \\#3 \\$criteria of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Database\\:\\:DVARP\\(\\) expects array, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Database/DVarPTest.php - - - - message: "#^Parameter \\#1 \\$database of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Database\\:\\:DVAR\\(\\) expects array, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Database/DVarTest.php - - - - message: "#^Parameter \\#2 \\$field of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Database\\:\\:DVAR\\(\\) expects int\\|string, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Database/DVarTest.php - - - - message: "#^Parameter \\#3 \\$criteria of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Database\\:\\:DVAR\\(\\) expects array, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Database/DVarTest.php - - - - message: "#^Part \\$timeValue \\(mixed\\) of encapsed string cannot be cast to string\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/DateTime/TimeValueTest.php - - - - message: "#^Part \\$formula \\(mixed\\) of encapsed string cannot be cast to string\\.$#" - count: 2 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Engineering/Bin2DecTest.php - - - - message: "#^Part \\$formula \\(mixed\\) of encapsed string cannot be cast to string\\.$#" - count: 2 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Engineering/Bin2HexTest.php - - - - message: "#^Part \\$formula \\(mixed\\) of encapsed string cannot be cast to string\\.$#" - count: 2 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Engineering/Bin2OctTest.php - - - - message: "#^Part \\$formula \\(mixed\\) of encapsed string cannot be cast to string\\.$#" - count: 2 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Engineering/Dec2BinTest.php - - - - message: "#^Part \\$formula \\(mixed\\) of encapsed string cannot be cast to string\\.$#" - count: 2 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Engineering/Dec2HexTest.php - - - - message: "#^Part \\$formula \\(mixed\\) of encapsed string cannot be cast to string\\.$#" - count: 2 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Engineering/Dec2OctTest.php - - - - message: "#^Part \\$formula \\(mixed\\) of encapsed string cannot be cast to string\\.$#" - count: 2 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Engineering/Hex2BinTest.php - - - - message: "#^Part \\$formula \\(mixed\\) of encapsed string cannot be cast to string\\.$#" - count: 2 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Engineering/Hex2DecTest.php - - - - message: "#^Part \\$formula \\(mixed\\) of encapsed string cannot be cast to string\\.$#" - count: 2 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Engineering/Hex2OctTest.php - - - - message: "#^Parameter \\#1 \\$complexNumber of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Engineering\\:\\:IMABS\\(\\) expects string, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Engineering/ImAbsTest.php - - - - message: "#^Parameter \\#1 \\$complexNumber of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Engineering\\:\\:IMARGUMENT\\(\\) expects string, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Engineering/ImArgumentTest.php - - - - message: "#^Parameter \\#1 \\$complexNumber of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Engineering\\:\\:IMCONJUGATE\\(\\) expects string, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Engineering/ImConjugateTest.php - - - - message: "#^Parameter \\#1 \\$complexNumber of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Engineering\\:\\:IMCOS\\(\\) expects string, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Engineering/ImCosTest.php - - - - message: "#^Parameter \\#1 \\$complexNumber of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Engineering\\:\\:IMCOSH\\(\\) expects string, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Engineering/ImCoshTest.php - - - - message: "#^Parameter \\#1 \\$complexNumber of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Engineering\\:\\:IMCOT\\(\\) expects string, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Engineering/ImCotTest.php - - - - message: "#^Parameter \\#1 \\$complexNumber of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Engineering\\:\\:IMCSC\\(\\) expects string, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Engineering/ImCscTest.php - - - - message: "#^Parameter \\#1 \\$complexNumber of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Engineering\\:\\:IMCSCH\\(\\) expects string, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Engineering/ImCschTest.php - - - - message: "#^Parameter \\#1 \\$complexNumber of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Engineering\\:\\:IMEXP\\(\\) expects string, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Engineering/ImExpTest.php - - - - message: "#^Parameter \\#1 \\$complexNumber of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Engineering\\:\\:IMLN\\(\\) expects string, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Engineering/ImLnTest.php - - - - message: "#^Parameter \\#1 \\$complexNumber of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Engineering\\:\\:IMLOG10\\(\\) expects string, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Engineering/ImLog10Test.php - - - - message: "#^Parameter \\#1 \\$complexNumber of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Engineering\\:\\:IMLOG2\\(\\) expects string, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Engineering/ImLog2Test.php - - - - message: "#^Parameter \\#1 \\$complexNumber of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Engineering\\:\\:IMREAL\\(\\) expects string, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Engineering/ImRealTest.php - - - - message: "#^Parameter \\#1 \\$complexNumber of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Engineering\\:\\:IMSEC\\(\\) expects string, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Engineering/ImSecTest.php - - - - message: "#^Parameter \\#1 \\$complexNumber of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Engineering\\:\\:IMSECH\\(\\) expects string, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Engineering/ImSechTest.php - - - - message: "#^Parameter \\#1 \\$complexNumber of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Engineering\\:\\:IMSIN\\(\\) expects string, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Engineering/ImSinTest.php - - - - message: "#^Parameter \\#1 \\$complexNumber of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Engineering\\:\\:IMSINH\\(\\) expects string, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Engineering/ImSinhTest.php - - - - message: "#^Parameter \\#1 \\$complexNumber of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Engineering\\:\\:IMSQRT\\(\\) expects string, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Engineering/ImSqrtTest.php - - - - message: "#^Parameter \\#1 \\$complexNumber of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Engineering\\:\\:IMTAN\\(\\) expects string, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Engineering/ImTanTest.php - - - - message: "#^Parameter \\#1 \\$complexNumber of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Engineering\\:\\:IMAGINARY\\(\\) expects string, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Engineering/ImaginaryTest.php - - - - message: "#^Part \\$formula \\(mixed\\) of encapsed string cannot be cast to string\\.$#" - count: 2 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Engineering/Oct2BinTest.php - - - - message: "#^Part \\$formula \\(mixed\\) of encapsed string cannot be cast to string\\.$#" - count: 2 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Engineering/Oct2DecTest.php - - - - message: "#^Part \\$formula \\(mixed\\) of encapsed string cannot be cast to string\\.$#" - count: 2 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Engineering/Oct2HexTest.php - - - - message: "#^Parameter \\#1 \\$nominalRate of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Financial\\:\\:EFFECT\\(\\) expects float, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Financial/EffectTest.php - - - - message: "#^Parameter \\#2 \\$periodsPerYear of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Financial\\:\\:EFFECT\\(\\) expects int, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Financial/EffectTest.php - - - - message: "#^Parameter \\#1 \\$year of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Financial\\\\Helpers\\:\\:daysPerYear\\(\\) expects int\\|string, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Financial/HelpersTest.php - - - - message: "#^Parameter \\#2 \\$basis of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Financial\\\\Helpers\\:\\:daysPerYear\\(\\) expects int\\|string, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Financial/HelpersTest.php - - - - message: "#^Parameter \\#1 \\$effectiveRate of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Financial\\:\\:NOMINAL\\(\\) expects float, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Financial/NominalTest.php - - - - message: "#^Parameter \\#2 \\$periodsPerYear of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Financial\\:\\:NOMINAL\\(\\) expects int, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Financial/NominalTest.php - - - - message: "#^Parameter \\#3 \\$message of static method PHPUnit\\\\Framework\\\\Assert\\:\\:assertEquals\\(\\) expects string, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Financial/XNpvTest.php - - - - message: "#^Parameter \\#3 \\$message of static method PHPUnit\\\\Framework\\\\Assert\\:\\:assertEquals\\(\\) expects string, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Financial/XirrTest.php - - - - message: "#^Part \\$number \\(mixed\\) of encapsed string cannot be cast to string\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/MathTrig/AcotTest.php - - - - message: "#^Part \\$number \\(mixed\\) of encapsed string cannot be cast to string\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/MathTrig/AcothTest.php - - - - message: "#^Part \\$angle \\(mixed\\) of encapsed string cannot be cast to string\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/MathTrig/CotTest.php - - - - message: "#^Part \\$angle \\(mixed\\) of encapsed string cannot be cast to string\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/MathTrig/CothTest.php - - - - message: "#^Part \\$angle \\(mixed\\) of encapsed string cannot be cast to string\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/MathTrig/CscTest.php - - - - message: "#^Part \\$angle \\(mixed\\) of encapsed string cannot be cast to string\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/MathTrig/CschTest.php - - - - message: "#^Part \\$value \\(mixed\\) of encapsed string cannot be cast to string\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/MathTrig/EvenTest.php - - - - message: "#^Part \\$formula \\(mixed\\) of encapsed string cannot be cast to string\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/MathTrig/MRoundTest.php - - - - message: "#^Part \\$matrix \\(mixed\\) of encapsed string cannot be cast to string\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/MathTrig/MdeTermTest.php - - - - message: "#^Part \\$value \\(mixed\\) of encapsed string cannot be cast to string\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/MathTrig/OddTest.php - - - - message: "#^Cannot cast mixed to int\\.$#" - count: 2 - path: tests/PhpSpreadsheetTests/Calculation/Functions/MathTrig/RandBetweenTest.php - - - - message: "#^Part \\$formula \\(mixed\\) of encapsed string cannot be cast to string\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/MathTrig/RomanTest.php - - - - message: "#^Part \\$formula \\(mixed\\) of encapsed string cannot be cast to string\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/MathTrig/RoundDownTest.php - - - - message: "#^Part \\$formula \\(mixed\\) of encapsed string cannot be cast to string\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/MathTrig/RoundTest.php - - - - message: "#^Part \\$formula \\(mixed\\) of encapsed string cannot be cast to string\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/MathTrig/RoundUpTest.php - - - - message: "#^Part \\$angle \\(mixed\\) of encapsed string cannot be cast to string\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/MathTrig/SecTest.php - - - - message: "#^Part \\$angle \\(mixed\\) of encapsed string cannot be cast to string\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/MathTrig/SechTest.php - - - - message: "#^Part \\$value \\(mixed\\) of encapsed string cannot be cast to string\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/MathTrig/SignTest.php - - - - message: "#^Part \\$type \\(mixed\\) of encapsed string cannot be cast to string\\.$#" - count: 3 - path: tests/PhpSpreadsheetTests/Calculation/Functions/MathTrig/SubTotalTest.php - - - - message: "#^Parameter \\#1 \\$probability of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Statistical\\:\\:CHIINV\\(\\) expects float, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Statistical/ChiInvRightTailTest.php - - - - message: "#^Parameter \\#2 \\$degrees of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Statistical\\:\\:CHIINV\\(\\) expects float, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Statistical/ChiInvRightTailTest.php - - - - message: "#^Parameter \\#1 \\$value of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Statistical\\:\\:FISHERINV\\(\\) expects float, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Statistical/FisherInvTest.php - - - - message: "#^Parameter \\#1 \\$value of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Statistical\\:\\:FISHER\\(\\) expects float, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Statistical/FisherTest.php - - - - message: "#^Parameter \\#1 \\$value of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Statistical\\:\\:GAMMALN\\(\\) expects float, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Statistical/GammaLnTest.php - - - - message: "#^Parameter \\#1 \\$value of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Statistical\\:\\:GAMMAFunction\\(\\) expects float, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Statistical/GammaTest.php - - - - message: "#^Parameter \\#1 \\$value of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Statistical\\:\\:GAUSS\\(\\) expects float, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Statistical/GaussTest.php - - - - message: "#^Parameter \\#1 \\$yValues of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Statistical\\:\\:GROWTH\\(\\) expects array, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Statistical/GrowthTest.php - - - - message: "#^Parameter \\#1 \\$yValues of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Statistical\\:\\:LINEST\\(\\) expects array, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Statistical/LinEstTest.php - - - - message: "#^Parameter \\#2 \\$xValues of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Statistical\\:\\:LINEST\\(\\) expects array\\|null, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Statistical/LinEstTest.php - - - - message: "#^Parameter \\#3 \\$const of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Statistical\\:\\:LINEST\\(\\) expects bool, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Statistical/LinEstTest.php - - - - message: "#^Parameter \\#4 \\$stats of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Statistical\\:\\:LINEST\\(\\) expects bool, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Statistical/LinEstTest.php - - - - message: "#^Parameter \\#1 \\$yValues of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Statistical\\:\\:LOGEST\\(\\) expects array, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Statistical/LogEstTest.php - - - - message: "#^Parameter \\#2 \\$xValues of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Statistical\\:\\:LOGEST\\(\\) expects array\\|null, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Statistical/LogEstTest.php - - - - message: "#^Parameter \\#3 \\$const of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Statistical\\:\\:LOGEST\\(\\) expects bool, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Statistical/LogEstTest.php - - - - message: "#^Parameter \\#4 \\$stats of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Statistical\\:\\:LOGEST\\(\\) expects bool, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Statistical/LogEstTest.php - - - - message: "#^Parameter \\#1 \\$value of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Statistical\\:\\:TDIST\\(\\) expects float, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Statistical/TDistTest.php - - - - message: "#^Parameter \\#2 \\$degrees of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Statistical\\:\\:TDIST\\(\\) expects float, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Statistical/TDistTest.php - - - - message: "#^Parameter \\#3 \\$tails of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Statistical\\:\\:TDIST\\(\\) expects float, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Statistical/TDistTest.php - - - - message: "#^Parameter \\#1 \\$probability of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Statistical\\:\\:TINV\\(\\) expects float, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Statistical/TinvTest.php - - - - message: "#^Parameter \\#2 \\$degrees of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Statistical\\:\\:TINV\\(\\) expects float, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Statistical/TinvTest.php - - - - message: "#^Parameter \\#1 \\$yValues of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Statistical\\:\\:TREND\\(\\) expects array, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Statistical/TrendTest.php - - - - message: "#^Parameter \\#1 \\$value of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Statistical\\:\\:WEIBULL\\(\\) expects float, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Statistical/WeibullTest.php - - - - message: "#^Parameter \\#2 \\$alpha of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Statistical\\:\\:WEIBULL\\(\\) expects float, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Statistical/WeibullTest.php - - - - message: "#^Parameter \\#3 \\$beta of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Statistical\\:\\:WEIBULL\\(\\) expects float, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Statistical/WeibullTest.php - - - - message: "#^Parameter \\#4 \\$cumulative of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Statistical\\:\\:WEIBULL\\(\\) expects bool, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Statistical/WeibullTest.php - - - - message: "#^Parameter \\#1 \\$dataSet of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Statistical\\:\\:ZTEST\\(\\) expects float, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Statistical/ZTestTest.php - - - - message: "#^Parameter \\#2 \\$m0 of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Statistical\\:\\:ZTEST\\(\\) expects float, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Statistical/ZTestTest.php - - - - message: "#^Parameter \\#3 \\$sigma of static method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Statistical\\:\\:ZTEST\\(\\) expects float\\|null, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/Statistical/ZTestTest.php - - - - message: "#^Parameter \\#1 \\$locale of static method PhpOffice\\\\PhpSpreadsheet\\\\Settings\\:\\:setLocale\\(\\) expects string, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/TextData/LeftTest.php - - - - message: "#^Parameter \\#1 \\$locale of static method PhpOffice\\\\PhpSpreadsheet\\\\Settings\\:\\:setLocale\\(\\) expects string, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/TextData/LowerTest.php - - - - message: "#^Parameter \\#1 \\$locale of static method PhpOffice\\\\PhpSpreadsheet\\\\Settings\\:\\:setLocale\\(\\) expects string, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/TextData/MidTest.php - - - - message: "#^Parameter \\#1 \\$locale of static method PhpOffice\\\\PhpSpreadsheet\\\\Settings\\:\\:setLocale\\(\\) expects string, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/TextData/ProperTest.php - - - - message: "#^Parameter \\#1 \\$locale of static method PhpOffice\\\\PhpSpreadsheet\\\\Settings\\:\\:setLocale\\(\\) expects string, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/TextData/RightTest.php - - - - message: "#^Parameter \\#1 \\$locale of static method PhpOffice\\\\PhpSpreadsheet\\\\Settings\\:\\:setLocale\\(\\) expects string, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Calculation/Functions/TextData/UpperTest.php - - - - message: "#^Parameter \\#1 \\$currencyCode of static method PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\StringHelper\\:\\:setCurrencyCode\\(\\) expects string, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Cell/AdvancedValueBinderTest.php - - - - message: "#^Parameter \\#1 \\$separator of static method PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\StringHelper\\:\\:setDecimalSeparator\\(\\) expects string, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Cell/AdvancedValueBinderTest.php - - - - message: "#^Parameter \\#1 \\$separator of static method PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\StringHelper\\:\\:setThousandsSeparator\\(\\) expects string, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Cell/AdvancedValueBinderTest.php - - - - message: "#^Cannot access offset \\(int\\|string\\) on mixed\\.$#" - count: 3 - path: tests/PhpSpreadsheetTests/Cell/CoordinateTest.php - - - - message: "#^Parameter \\#1 \\$columnAddress of static method PhpOffice\\\\PhpSpreadsheet\\\\Cell\\\\Coordinate\\:\\:columnIndexFromString\\(\\) expects string, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Cell/CoordinateTest.php - - - - message: "#^Parameter \\#1 \\$coordinateCollection of static method PhpOffice\\\\PhpSpreadsheet\\\\Cell\\\\Coordinate\\:\\:mergeRangesInCollection\\(\\) expects array, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Cell/CoordinateTest.php - - - - message: "#^Parameter \\#1 \\$range of static method PhpOffice\\\\PhpSpreadsheet\\\\Cell\\\\Coordinate\\:\\:buildRange\\(\\) expects array, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Cell/CoordinateTest.php - - message: "#^Call to static method PHPUnit\\\\Framework\\\\Assert\\:\\:assertSame\\(\\) with arguments PhpOffice\\\\PhpSpreadsheet\\\\Cell\\\\Cell, null and 'should get exact…' will always evaluate to false\\.$#" count: 1 @@ -8240,41 +5880,6 @@ parameters: count: 1 path: tests/PhpSpreadsheetTests/Collection/CellsTest.php - - - message: "#^Parameter \\#1 \\$propertyName of method PhpOffice\\\\PhpSpreadsheet\\\\Document\\\\Properties\\:\\:getCustomPropertyType\\(\\) expects string, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Document/PropertiesTest.php - - - - message: "#^Parameter \\#1 \\$propertyName of method PhpOffice\\\\PhpSpreadsheet\\\\Document\\\\Properties\\:\\:getCustomPropertyValue\\(\\) expects string, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Document/PropertiesTest.php - - - - message: "#^Parameter \\#1 \\$propertyName of method PhpOffice\\\\PhpSpreadsheet\\\\Document\\\\Properties\\:\\:isCustomPropertySet\\(\\) expects string, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Document/PropertiesTest.php - - - - message: "#^Parameter \\#1 \\$propertyName of method PhpOffice\\\\PhpSpreadsheet\\\\Document\\\\Properties\\:\\:setCustomProperty\\(\\) expects string, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Document/PropertiesTest.php - - - - message: "#^Parameter \\#1 \\$timestamp of method PhpOffice\\\\PhpSpreadsheet\\\\Document\\\\Properties\\:\\:setCreated\\(\\) expects float\\|int\\|string\\|null, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Document/PropertiesTest.php - - - - message: "#^Parameter \\#1 \\$timestamp of method PhpOffice\\\\PhpSpreadsheet\\\\Document\\\\Properties\\:\\:setModified\\(\\) expects float\\|int\\|string\\|null, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Document/PropertiesTest.php - - - - message: "#^Part \\$result \\(mixed\\) of encapsed string cannot be cast to string\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Document/PropertiesTest.php - - message: "#^Method PhpOffice\\\\PhpSpreadsheetTests\\\\Functional\\\\ColumnWidthTest\\:\\:testReadColumnWidth\\(\\) has parameter \\$format with no type specified\\.$#" count: 1 @@ -8296,22 +5901,22 @@ parameters: path: tests/PhpSpreadsheetTests/Functional/DrawingImageHyperlinkTest.php - - message: "#^Parameter \\#1 \\$im(age)? of function imagecolorallocate expects (GdImage|resource), (GdImage|resource)\\|false given\\.$#" + message: "#^Parameter \\#1 \\$im of function imagecolorallocate expects resource, resource\\|false given\\.$#" count: 1 path: tests/PhpSpreadsheetTests/Functional/DrawingImageHyperlinkTest.php - - message: "#^Parameter \\#1 \\$im(age)? of function imagestring expects (GdImage|resource), (GdImage|resource)\\|false given\\.$#" + message: "#^Parameter \\#1 \\$im of function imagestring expects resource, resource\\|false given\\.$#" count: 1 path: tests/PhpSpreadsheetTests/Functional/DrawingImageHyperlinkTest.php - - message: "#^Parameter \\#1 \\$value of method PhpOffice\\\\PhpSpreadsheet\\\\Worksheet\\\\MemoryDrawing\\:\\:setImageResource\\(\\) expects GdImage\\|resource, (GdImage|resource)\\|false given\\.$#" + message: "#^Parameter \\#1 \\$value of method PhpOffice\\\\PhpSpreadsheet\\\\Worksheet\\\\MemoryDrawing\\:\\:setImageResource\\(\\) expects GdImage\\|resource, resource\\|false given\\.$#" count: 1 path: tests/PhpSpreadsheetTests/Functional/DrawingImageHyperlinkTest.php - - message: "#^Parameter \\#6 \\$col(or)? of function imagestring expects int, int\\|false given\\.$#" + message: "#^Parameter \\#6 \\$col of function imagestring expects int, int\\|false given\\.$#" count: 1 path: tests/PhpSpreadsheetTests/Functional/DrawingImageHyperlinkTest.php @@ -8320,16 +5925,6 @@ parameters: count: 5 path: tests/PhpSpreadsheetTests/Functional/PrintAreaTest.php - - - message: "#^Parameter \\#2 \\$format of method PhpOffice\\\\PhpSpreadsheetTests\\\\Functional\\\\AbstractFunctional\\:\\:writeAndReload\\(\\) expects string, mixed given\\.$#" - count: 2 - path: tests/PhpSpreadsheetTests/Functional/ReadBlankCellsTest.php - - - - message: "#^Parameter \\#2 \\$format of method PhpOffice\\\\PhpSpreadsheetTests\\\\Functional\\\\AbstractFunctional\\:\\:writeAndReload\\(\\) expects string, mixed given\\.$#" - count: 2 - path: tests/PhpSpreadsheetTests/Functional/ReadFilterTest.php - - message: "#^Cannot access offset 'size' on array\\{0\\: int, 1\\: int, 2\\: int, 3\\: int, 4\\: int, 5\\: int, 6\\: int, 7\\: int, \\.\\.\\.\\}\\|false\\.$#" count: 2 @@ -8341,25 +5936,15 @@ parameters: path: tests/PhpSpreadsheetTests/Functional/StreamTest.php - - message: "#^Parameter \\#1 \\$(fp|stream) of function fstat expects resource, resource\\|false given\\.$#" + message: "#^Parameter \\#1 \\$fp of function fstat expects resource, resource\\|false given\\.$#" count: 1 path: tests/PhpSpreadsheetTests/Functional/StreamTest.php - - - message: "#^Parameter \\#1 \\$html of method PhpOffice\\\\PhpSpreadsheet\\\\Helper\\\\Html\\:\\:toRichTextObject\\(\\) expects string, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Helper/HtmlTest.php - - message: "#^Parameter \\#1 \\$expected of static method PHPUnit\\\\Framework\\\\Assert\\:\\:assertInstanceOf\\(\\) expects class\\-string\\, string given\\.$#" count: 3 path: tests/PhpSpreadsheetTests/IOFactoryTest.php - - - message: "#^Parameter \\#3 \\$phpSpreadsheetFunctions of class PhpOffice\\\\PhpSpreadsheetInfra\\\\LocaleGenerator constructor expects array, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/LocaleGeneratorTest.php - - message: "#^Cannot call method getValue\\(\\) on PhpOffice\\\\PhpSpreadsheet\\\\NamedFormula\\|null\\.$#" count: 5 @@ -8370,11 +5955,6 @@ parameters: count: 5 path: tests/PhpSpreadsheetTests/NamedRangeTest.php - - - message: "#^Part \\$result \\(mixed\\) of encapsed string cannot be cast to string\\.$#" - count: 2 - path: tests/PhpSpreadsheetTests/Reader/Ods/OdsPropertiesTest.php - - message: "#^Property PhpOffice\\\\PhpSpreadsheetTests\\\\Reader\\\\Ods\\\\OdsTest\\:\\:\\$spreadsheetData \\(PhpOffice\\\\PhpSpreadsheet\\\\Spreadsheet\\) in isset\\(\\) is not nullable\\.$#" count: 1 @@ -8405,11 +5985,6 @@ parameters: count: 1 path: tests/PhpSpreadsheetTests/Reader/Security/XmlScannerTest.php - - - message: "#^Parameter \\#1 \\$str(ing)? of function strrev expects string, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Reader/Security/XmlScannerTest.php - - message: "#^Method PhpOffice\\\\PhpSpreadsheetTests\\\\Reader\\\\Xlsx\\\\AutoFilterTest\\:\\:getAutoFilterInstance\\(\\) has no return type specified\\.$#" count: 1 @@ -8475,21 +6050,11 @@ parameters: count: 1 path: tests/PhpSpreadsheetTests/Reader/Xlsx/ConditionalFormattingDataBarXlsxTest.php - - - message: "#^Part \\$result \\(mixed\\) of encapsed string cannot be cast to string\\.$#" - count: 2 - path: tests/PhpSpreadsheetTests/Reader/Xlsx/PropertiesTest.php - - message: "#^Cannot call method getPlotArea\\(\\) on PhpOffice\\\\PhpSpreadsheet\\\\Chart\\\\Chart\\|null\\.$#" count: 2 path: tests/PhpSpreadsheetTests/Reader/Xlsx/SheetsXlsxChartTest.php - - - message: "#^Part \\$creationDate \\(mixed\\) of encapsed string cannot be cast to string\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Reader/Xml/XmlLoadTest.php - - message: "#^Argument of an invalid type array\\\\|false supplied for foreach, only iterables are supported\\.$#" count: 1 @@ -8500,91 +6065,11 @@ parameters: count: 1 path: tests/PhpSpreadsheetTests/Reader/Xml/XmlTest.php - - - message: "#^Parameter \\#1 \\$codePage of static method PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\CodePage\\:\\:numberToName\\(\\) expects int, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Shared/CodePageTest.php - - - - message: "#^Parameter \\#1 \\$dateValue of static method PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\Date\\:\\:dateTimeToExcel\\(\\) expects DateTimeInterface, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Shared/DateTest.php - - - - message: "#^Parameter \\#1 \\$excelTimestamp of static method PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\Date\\:\\:excelToTimestamp\\(\\) expects float\\|int, mixed given\\.$#" - count: 3 - path: tests/PhpSpreadsheetTests/Shared/DateTest.php - - - - message: "#^Parameter \\#1 \\$unixTimestamp of static method PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\Date\\:\\:timestampToExcel\\(\\) expects int, mixed given\\.$#" - count: 3 - path: tests/PhpSpreadsheetTests/Shared/DateTest.php - - - - message: "#^Parameter \\#2 \\$timeZone of static method PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\Date\\:\\:excelToTimestamp\\(\\) expects DateTimeZone\\|string\\|null, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Shared/DateTest.php - - - - message: "#^Parameter \\#1 \\$fontSizeInPoints of static method PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\Font\\:\\:fontSizeToPixels\\(\\) expects int, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Shared/FontTest.php - - - - message: "#^Parameter \\#1 \\$sizeInCm of static method PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\Font\\:\\:centimeterSizeToPixels\\(\\) expects int, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Shared/FontTest.php - - - - message: "#^Parameter \\#1 \\$sizeInInch of static method PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\Font\\:\\:inchSizeToPixels\\(\\) expects int, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Shared/FontTest.php - - message: "#^Parameter \\#1 \\$currencyCode of static method PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\StringHelper\\:\\:setCurrencyCode\\(\\) expects string, null given\\.$#" count: 1 path: tests/PhpSpreadsheetTests/Shared/StringHelperTest.php - - - message: "#^Cannot access offset 0 on mixed\\.$#" - count: 3 - path: tests/PhpSpreadsheetTests/Shared/Trend/ExponentialBestFitTest.php - - - - message: "#^Cannot access offset 1 on mixed\\.$#" - count: 3 - path: tests/PhpSpreadsheetTests/Shared/Trend/ExponentialBestFitTest.php - - - - message: "#^Parameter \\#1 \\$yValues of class PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\Trend\\\\ExponentialBestFit constructor expects array\\, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Shared/Trend/ExponentialBestFitTest.php - - - - message: "#^Parameter \\#2 \\$xValues of class PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\Trend\\\\ExponentialBestFit constructor expects array\\, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Shared/Trend/ExponentialBestFitTest.php - - - - message: "#^Cannot access offset 0 on mixed\\.$#" - count: 3 - path: tests/PhpSpreadsheetTests/Shared/Trend/LinearBestFitTest.php - - - - message: "#^Cannot access offset 1 on mixed\\.$#" - count: 3 - path: tests/PhpSpreadsheetTests/Shared/Trend/LinearBestFitTest.php - - - - message: "#^Parameter \\#1 \\$yValues of class PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\Trend\\\\LinearBestFit constructor expects array\\, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Shared/Trend/LinearBestFitTest.php - - - - message: "#^Parameter \\#2 \\$xValues of class PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\Trend\\\\LinearBestFit constructor expects array\\, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Shared/Trend/LinearBestFitTest.php - - message: "#^Method PhpOffice\\\\PhpSpreadsheetTests\\\\SpreadsheetTest\\:\\:testGetSheetByName\\(\\) has parameter \\$index with no type specified\\.$#" count: 1 @@ -8595,21 +6080,6 @@ parameters: count: 1 path: tests/PhpSpreadsheetTests/SpreadsheetTest.php - - - message: "#^Parameter \\#1 \\$rgbValue of static method PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\Color\\:\\:getBlue\\(\\) expects string, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Style/ColorTest.php - - - - message: "#^Parameter \\#1 \\$rgbValue of static method PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\Color\\:\\:getGreen\\(\\) expects string, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Style/ColorTest.php - - - - message: "#^Parameter \\#1 \\$rgbValue of static method PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\Color\\:\\:getRed\\(\\) expects string, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Style/ColorTest.php - - message: "#^Parameter \\#1 \\$condition of method PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\Conditional\\:\\:addCondition\\(\\) expects string, float given\\.$#" count: 2 @@ -8626,27 +6096,22 @@ parameters: path: tests/PhpSpreadsheetTests/Worksheet/AutoFilter/ColumnTest.php - - message: "#^Parameter \\#2 \\$value of method PhpOffice\\\\PhpSpreadsheet\\\\Worksheet\\\\AutoFilter\\\\Column\\\\Rule\\:\\:setRule\\(\\) expects array\\\\|int\\|string, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Worksheet/AutoFilter/DateGroupTest.php - - - - message: "#^Parameter \\#1 \\$im(age)? of function imagecolorallocate expects (resource|GdImage), (resource|GdImage)\\|false given\\.$#" + message: "#^Parameter \\#1 \\$im of function imagecolorallocate expects resource, resource\\|false given\\.$#" count: 1 path: tests/PhpSpreadsheetTests/Worksheet/DrawingTest.php - - message: "#^Parameter \\#1 \\$im(age)? of function imagestring expects (resource|GdImage), (resource|GdImage)\\|false given\\.$#" + message: "#^Parameter \\#1 \\$im of function imagestring expects resource, resource\\|false given\\.$#" count: 1 path: tests/PhpSpreadsheetTests/Worksheet/DrawingTest.php - - message: "#^Parameter \\#1 \\$value of method PhpOffice\\\\PhpSpreadsheet\\\\Worksheet\\\\MemoryDrawing\\:\\:setImageResource\\(\\) expects GdImage\\|resource, (GdImage|resource)\\|false given\\.$#" + message: "#^Parameter \\#1 \\$value of method PhpOffice\\\\PhpSpreadsheet\\\\Worksheet\\\\MemoryDrawing\\:\\:setImageResource\\(\\) expects GdImage\\|resource, resource\\|false given\\.$#" count: 1 path: tests/PhpSpreadsheetTests/Worksheet/DrawingTest.php - - message: "#^Parameter \\#6 \\$col(or)? of function imagestring expects int, int\\|false given\\.$#" + message: "#^Parameter \\#6 \\$col of function imagestring expects int, int\\|false given\\.$#" count: 1 path: tests/PhpSpreadsheetTests/Worksheet/DrawingTest.php @@ -8655,16 +6120,6 @@ parameters: count: 1 path: tests/PhpSpreadsheetTests/Worksheet/RowCellIterator2Test.php - - - message: "#^Cannot access offset 0 on mixed\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Worksheet/WorksheetTest.php - - - - message: "#^Cannot access offset 1 on mixed\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Worksheet/WorksheetTest.php - - message: "#^Method PhpOffice\\\\PhpSpreadsheetTests\\\\Writer\\\\Html\\\\CallbackTest\\:\\:yellowBody\\(\\) should return string but returns string\\|null\\.$#" count: 1 @@ -8690,76 +6145,11 @@ parameters: count: 1 path: tests/PhpSpreadsheetTests/Writer/Html/GridlinesTest.php - - - message: "#^Cannot call method getPlainText\\(\\) on mixed\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Writer/Html/HtmlCommentsTest.php - - message: "#^Cannot call method setBold\\(\\) on PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\Font\\|null\\.$#" count: 3 path: tests/PhpSpreadsheetTests/Writer/Html/HtmlCommentsTest.php - - - message: "#^Parameter \\#1 \\$text of method PhpOffice\\\\PhpSpreadsheet\\\\Comment\\:\\:setText\\(\\) expects PhpOffice\\\\PhpSpreadsheet\\\\RichText\\\\RichText, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Writer/Html/HtmlCommentsTest.php - - - - message: "#^Parameter \\#1 \\$formatCode of method PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\NumberFormat\\:\\:setFormatCode\\(\\) expects string, mixed given\\.$#" - count: 2 - path: tests/PhpSpreadsheetTests/Writer/Html/HtmlNumberFormatTest.php - - - - message: "#^Cannot access offset 10 on mixed\\.$#" - count: 2 - path: tests/PhpSpreadsheetTests/Writer/Xls/WorkbookTest.php - - - - message: "#^Cannot access offset 12 on mixed\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Writer/Xls/WorkbookTest.php - - - - message: "#^Cannot access offset 25 on mixed\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Writer/Xls/WorkbookTest.php - - - - message: "#^Cannot access offset 8 on mixed\\.$#" - count: 5 - path: tests/PhpSpreadsheetTests/Writer/Xls/WorkbookTest.php - - - - message: "#^Cannot access offset 9 on mixed\\.$#" - count: 2 - path: tests/PhpSpreadsheetTests/Writer/Xls/WorkbookTest.php - - - - message: "#^Cannot access offset int\\|string\\|false on mixed\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Writer/Xls/WorkbookTest.php - - - - message: "#^Parameter \\#1 \\$(input|array) of function array_keys expects array, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Writer/Xls/WorkbookTest.php - - - - message: "#^Parameter \\#1 \\$palette of method PhpOffice\\\\PhpSpreadsheetTests\\\\Writer\\\\Xls\\\\WorkbookTest\\:\\:paletteToColor\\(\\) expects array, mixed given\\.$#" - count: 6 - path: tests/PhpSpreadsheetTests/Writer/Xls/WorkbookTest.php - - - - message: "#^Parameter \\#2 \\$array of function array_map expects array, mixed given\\.$#" - count: 2 - path: tests/PhpSpreadsheetTests/Writer/Xls/WorkbookTest.php - - - - message: "#^Parameter \\#2 \\.\\.\\.\\$values of function sprintf expects bool\\|float\\|int\\|string\\|null, mixed given\\.$#" - count: 1 - path: tests/PhpSpreadsheetTests/Writer/Xlsx/LocaleFloatsTest.php - - message: "#^Cannot call method getCell\\(\\) on PhpOffice\\\\PhpSpreadsheet\\\\Worksheet\\\\Worksheet\\|null\\.$#" count: 4 diff --git a/vendor/phpoffice/phpspreadsheet/phpstan-conditional.php b/vendor/phpoffice/phpspreadsheet/phpstan-conditional.php index 5501039b9..c5d28dd6b 100644 --- a/vendor/phpoffice/phpspreadsheet/phpstan-conditional.php +++ b/vendor/phpoffice/phpspreadsheet/phpstan-conditional.php @@ -42,7 +42,7 @@ if (PHP_VERSION_ID < 80000) { ]; // Erroneous analysis by Phpstan before PHP8 - mb_strlen does not return false $config['parameters']['ignoreErrors'][] = [ - 'message' => '#^Method PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\StringHelper\\:\\:countCharacters\\(\\) should return int but returns int\\|false\\.$#', + 'message' => '#^Method PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\StringHelper\\:\\:countCharacters\\(\\) should return int but returns int(<0, max>)?\\|false\\.$#', 'path' => __DIR__ . '/src/PhpSpreadsheet/Shared/StringHelper.php', 'count' => 1, ]; diff --git a/vendor/phpoffice/phpspreadsheet/phpstan.neon.dist b/vendor/phpoffice/phpspreadsheet/phpstan.neon.dist index e975f21cf..e97e1ce84 100644 --- a/vendor/phpoffice/phpspreadsheet/phpstan.neon.dist +++ b/vendor/phpoffice/phpspreadsheet/phpstan.neon.dist @@ -5,7 +5,7 @@ includes: - vendor/phpstan/phpstan-phpunit/rules.neon parameters: - level: max + level: 8 paths: - src/ - tests/ diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/ArrayEnabled.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/ArrayEnabled.php new file mode 100644 index 000000000..fa90017d9 --- /dev/null +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/ArrayEnabled.php @@ -0,0 +1,56 @@ +initialise($arguments); + } + + protected static function evaluateSingleArgumentArray(callable $method, array $values): array + { + $result = []; + foreach ($values as $value) { + $result[] = $method($value); + } + + return $result; + } + + /** + * @param mixed ...$arguments + */ + protected static function evaluateArrayArguments(callable $method, ...$arguments): array + { + self::initialiseHelper($arguments); + $arguments = self::$arrayArgumentHelper->arguments(); + + return ArrayArgumentProcessor::processArguments(self::$arrayArgumentHelper, $method, ...$arguments); + } + + /** + * @param mixed ...$arguments + */ + protected static function evaluateArrayArgumentsSubset(callable $method, int $limit, ...$arguments): array + { + self::initialiseHelper(array_slice($arguments, 0, $limit)); + $trailingArguments = array_slice($arguments, $limit); + $arguments = self::$arrayArgumentHelper->arguments(); + $arguments = array_merge($arguments, $trailingArguments); + + return ArrayArgumentProcessor::processArguments(self::$arrayArgumentHelper, $method, ...$arguments); + } +} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/BinaryComparison.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/BinaryComparison.php new file mode 100644 index 000000000..5d4f261fc --- /dev/null +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/BinaryComparison.php @@ -0,0 +1,181 @@ + '' && $operand1[0] == Calculation::FORMULA_STRING_QUOTE) { + $operand1 = Calculation::unwrapResult($operand1); + } + if (is_string($operand2) && $operand2 > '' && $operand2[0] == Calculation::FORMULA_STRING_QUOTE) { + $operand2 = Calculation::unwrapResult($operand2); + } + + // Use case insensitive comparaison if not OpenOffice mode + if (Functions::getCompatibilityMode() != Functions::COMPATIBILITY_OPENOFFICE) { + if (is_string($operand1)) { + $operand1 = StringHelper::strToUpper($operand1); + } + if (is_string($operand2)) { + $operand2 = StringHelper::strToUpper($operand2); + } + } + + $useLowercaseFirstComparison = is_string($operand1) && + is_string($operand2) && + Functions::getCompatibilityMode() === Functions::COMPATIBILITY_OPENOFFICE; + + return self::evaluateComparison($operand1, $operand2, $operator, $useLowercaseFirstComparison); + } + + /** + * @param mixed $operand1 + * @param mixed $operand2 + */ + private static function evaluateComparison($operand1, $operand2, string $operator, bool $useLowercaseFirstComparison): bool + { + switch ($operator) { + // Equality + case '=': + return self::equal($operand1, $operand2); + // Greater than + case '>': + return self::greaterThan($operand1, $operand2, $useLowercaseFirstComparison); + // Less than + case '<': + return self::lessThan($operand1, $operand2, $useLowercaseFirstComparison); + // Greater than or equal + case '>=': + return self::greaterThanOrEqual($operand1, $operand2, $useLowercaseFirstComparison); + // Less than or equal + case '<=': + return self::lessThanOrEqual($operand1, $operand2, $useLowercaseFirstComparison); + // Inequality + case '<>': + return self::notEqual($operand1, $operand2); + default: + throw new Exception('Unsupported binary comparison operator'); + } + } + + /** + * @param mixed $operand1 + * @param mixed $operand2 + */ + private static function equal($operand1, $operand2): bool + { + if (is_numeric($operand1) && is_numeric($operand2)) { + $result = (abs($operand1 - $operand2) < self::DELTA); + } elseif (($operand1 === null && is_numeric($operand2)) || ($operand2 === null && is_numeric($operand1))) { + $result = $operand1 == $operand2; + } else { + $result = self::strcmpAllowNull($operand1, $operand2) == 0; + } + + return $result; + } + + /** + * @param mixed $operand1 + * @param mixed $operand2 + */ + private static function greaterThanOrEqual($operand1, $operand2, bool $useLowercaseFirstComparison): bool + { + if (is_numeric($operand1) && is_numeric($operand2)) { + $result = ((abs($operand1 - $operand2) < self::DELTA) || ($operand1 > $operand2)); + } elseif (($operand1 === null && is_numeric($operand2)) || ($operand2 === null && is_numeric($operand1))) { + $result = $operand1 >= $operand2; + } elseif ($useLowercaseFirstComparison) { + $result = self::strcmpLowercaseFirst($operand1, $operand2) >= 0; + } else { + $result = self::strcmpAllowNull($operand1, $operand2) >= 0; + } + + return $result; + } + + /** + * @param mixed $operand1 + * @param mixed $operand2 + */ + private static function lessThanOrEqual($operand1, $operand2, bool $useLowercaseFirstComparison): bool + { + if (is_numeric($operand1) && is_numeric($operand2)) { + $result = ((abs($operand1 - $operand2) < self::DELTA) || ($operand1 < $operand2)); + } elseif (($operand1 === null && is_numeric($operand2)) || ($operand2 === null && is_numeric($operand1))) { + $result = $operand1 <= $operand2; + } elseif ($useLowercaseFirstComparison) { + $result = self::strcmpLowercaseFirst($operand1, $operand2) <= 0; + } else { + $result = self::strcmpAllowNull($operand1, $operand2) <= 0; + } + + return $result; + } + + /** + * @param mixed $operand1 + * @param mixed $operand2 + */ + private static function greaterThan($operand1, $operand2, bool $useLowercaseFirstComparison): bool + { + return self::lessThanOrEqual($operand1, $operand2, $useLowercaseFirstComparison) !== true; + } + + /** + * @param mixed $operand1 + * @param mixed $operand2 + */ + private static function lessThan($operand1, $operand2, bool $useLowercaseFirstComparison): bool + { + return self::greaterThanOrEqual($operand1, $operand2, $useLowercaseFirstComparison) !== true; + } + + /** + * @param mixed $operand1 + * @param mixed $operand2 + */ + private static function notEqual($operand1, $operand2): bool + { + return self::equal($operand1, $operand2) !== true; + } +} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Calculation.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Calculation.php index 25f769590..f28d258e1 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Calculation.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Calculation.php @@ -173,13 +173,6 @@ class Calculation */ public $cyclicFormulaCount = 1; - /** - * Epsilon Precision used for comparisons in calculations. - * - * @var float - */ - private $delta = 0.1e-12; - /** * The current locale setting. * @@ -223,7 +216,7 @@ class Calculation * * @var array */ - private static $excelConstants = [ + public static $excelConstants = [ 'TRUE' => true, 'FALSE' => false, 'NULL' => null, @@ -1041,7 +1034,7 @@ class Calculation 'FILTER' => [ 'category' => Category::CATEGORY_LOOKUP_AND_REFERENCE, 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '3+', + 'argumentCount' => '2-3', ], 'FILTERXML' => [ 'category' => Category::CATEGORY_WEB, @@ -2078,7 +2071,7 @@ class Calculation ], 'RANDARRAY' => [ 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => [Functions::class, 'DUMMY'], + 'functionCall' => [MathTrig\Random::class, 'randArray'], 'argumentCount' => '0-5', ], 'RANDBETWEEN' => [ @@ -2220,8 +2213,8 @@ class Calculation ], 'SEQUENCE' => [ 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '2', + 'functionCall' => [MathTrig\MatrixFunctions::class, 'sequence'], + 'argumentCount' => '1-4', ], 'SERIESSUM' => [ 'category' => Category::CATEGORY_MATH_AND_TRIG, @@ -2759,8 +2752,6 @@ class Calculation public function __construct(?Spreadsheet $spreadsheet = null) { - $this->delta = 1 * 10 ** (0 - ini_get('precision')); - $this->spreadsheet = $spreadsheet; $this->cyclicReferenceStack = new CyclicReferenceStack(); $this->debugLog = new Logger($this->cyclicReferenceStack); @@ -3170,10 +3161,10 @@ class Calculation if (self::$functionReplaceFromExcel === null) { self::$functionReplaceFromExcel = []; foreach (array_keys(self::$localeFunctions) as $excelFunctionName) { - self::$functionReplaceFromExcel[] = '/(@?[^\w\.])' . preg_quote($excelFunctionName, '/') . '([\s]*\()/Ui'; + self::$functionReplaceFromExcel[] = '/(@?[^\w\.])' . preg_quote($excelFunctionName, '/') . '([\s]*\()/ui'; } foreach (array_keys(self::$localeBoolean) as $excelBoolean) { - self::$functionReplaceFromExcel[] = '/(@?[^\w\.])' . preg_quote($excelBoolean, '/') . '([^\w\.])/Ui'; + self::$functionReplaceFromExcel[] = '/(@?[^\w\.])' . preg_quote($excelBoolean, '/') . '([^\w\.])/ui'; } } @@ -3187,7 +3178,13 @@ class Calculation } } - return self::translateFormula(self::$functionReplaceFromExcel, self::$functionReplaceToLocale, $formula, ',', self::$localeArgumentSeparator); + return self::translateFormula( + self::$functionReplaceFromExcel, + self::$functionReplaceToLocale, + $formula, + ',', + self::$localeArgumentSeparator + ); } private static $functionReplaceFromLocale; @@ -3199,10 +3196,10 @@ class Calculation if (self::$functionReplaceFromLocale === null) { self::$functionReplaceFromLocale = []; foreach (self::$localeFunctions as $localeFunctionName) { - self::$functionReplaceFromLocale[] = '/(@?[^\w\.])' . preg_quote($localeFunctionName, '/') . '([\s]*\()/Ui'; + self::$functionReplaceFromLocale[] = '/(@?[^\w\.])' . preg_quote($localeFunctionName, '/') . '([\s]*\()/ui'; } foreach (self::$localeBoolean as $excelBoolean) { - self::$functionReplaceFromLocale[] = '/(@?[^\w\.])' . preg_quote($excelBoolean, '/') . '([^\w\.])/Ui'; + self::$functionReplaceFromLocale[] = '/(@?[^\w\.])' . preg_quote($excelBoolean, '/') . '([^\w\.])/ui'; } } @@ -3742,6 +3739,8 @@ class Calculation return self::FORMULA_STRING_QUOTE . $value . self::FORMULA_STRING_QUOTE; } elseif (is_bool($value)) { return ($value) ? self::$localeBoolean['TRUE'] : self::$localeBoolean['FALSE']; + } elseif ($value === null) { + return self::$localeBoolean['NULL']; } } @@ -4369,6 +4368,12 @@ class Calculation if (($operandData['reference'] === null) && (is_array($operand))) { $rKeys = array_keys($operand); $rowKey = array_shift($rKeys); + if (is_array($operand[$rowKey]) === false) { + $operandData['value'] = $operand[$rowKey]; + + return $operand[$rowKey]; + } + $cKeys = array_keys(array_keys($operand[$rowKey])); $colKey = array_shift($cKeys); if (ctype_upper("$colKey")) { @@ -4509,7 +4514,7 @@ class Calculation case '<=': // Less than or Equal to case '=': // Equality case '<>': // Inequality - $result = $this->executeBinaryComparisonOperation($cellID, $operand1, $operand2, $token, $stack); + $result = $this->executeBinaryComparisonOperation($operand1, $operand2, (string) $token, $stack); if (isset($storeKey)) { $branchStore[$storeKey] = $result; } @@ -4952,21 +4957,20 @@ class Calculation } /** - * @param null|string $cellID * @param mixed $operand1 * @param mixed $operand2 * @param string $operation * * @return array */ - private function executeArrayComparison($cellID, $operand1, $operand2, $operation, Stack &$stack, bool $recursingArrays) + private function executeArrayComparison($operand1, $operand2, $operation, Stack &$stack, bool $recursingArrays) { $result = []; if (!is_array($operand2)) { // Operand 1 is an array, Operand 2 is a scalar foreach ($operand1 as $x => $operandData) { $this->debugLog->writeDebugLog('Evaluating Comparison ', $this->showValue($operandData), ' ', $operation, ' ', $this->showValue($operand2)); - $this->executeBinaryComparisonOperation($cellID, $operandData, $operand2, $operation, $stack); + $this->executeBinaryComparisonOperation($operandData, $operand2, $operation, $stack); $r = $stack->pop(); $result[$x] = $r['value']; } @@ -4974,7 +4978,7 @@ class Calculation // Operand 1 is a scalar, Operand 2 is an array foreach ($operand2 as $x => $operandData) { $this->debugLog->writeDebugLog('Evaluating Comparison ', $this->showValue($operand1), ' ', $operation, ' ', $this->showValue($operandData)); - $this->executeBinaryComparisonOperation($cellID, $operand1, $operandData, $operation, $stack); + $this->executeBinaryComparisonOperation($operand1, $operandData, $operation, $stack); $r = $stack->pop(); $result[$x] = $r['value']; } @@ -4985,7 +4989,7 @@ class Calculation } foreach ($operand1 as $x => $operandData) { $this->debugLog->writeDebugLog('Evaluating Comparison ', $this->showValue($operandData), ' ', $operation, ' ', $this->showValue($operand2[$x])); - $this->executeBinaryComparisonOperation($cellID, $operandData, $operand2[$x], $operation, $stack, true); + $this->executeBinaryComparisonOperation($operandData, $operand2[$x], $operation, $stack, true); $r = $stack->pop(); $result[$x] = $r['value']; } @@ -4999,7 +5003,6 @@ class Calculation } /** - * @param null|string $cellID * @param mixed $operand1 * @param mixed $operand2 * @param string $operation @@ -5007,97 +5010,14 @@ class Calculation * * @return mixed */ - private function executeBinaryComparisonOperation($cellID, $operand1, $operand2, $operation, Stack &$stack, $recursingArrays = false) + private function executeBinaryComparisonOperation($operand1, $operand2, $operation, Stack &$stack, $recursingArrays = false) { // If we're dealing with matrix operations, we want a matrix result if ((is_array($operand1)) || (is_array($operand2))) { - return $this->executeArrayComparison($cellID, $operand1, $operand2, $operation, $stack, $recursingArrays); + return $this->executeArrayComparison($operand1, $operand2, $operation, $stack, $recursingArrays); } - // Simple validate the two operands if they are string values - if (is_string($operand1) && $operand1 > '' && $operand1[0] == self::FORMULA_STRING_QUOTE) { - $operand1 = self::unwrapResult($operand1); - } - if (is_string($operand2) && $operand2 > '' && $operand2[0] == self::FORMULA_STRING_QUOTE) { - $operand2 = self::unwrapResult($operand2); - } - - // Use case insensitive comparaison if not OpenOffice mode - if (Functions::getCompatibilityMode() != Functions::COMPATIBILITY_OPENOFFICE) { - if (is_string($operand1)) { - $operand1 = Shared\StringHelper::strToUpper($operand1); - } - if (is_string($operand2)) { - $operand2 = Shared\StringHelper::strToUpper($operand2); - } - } - - $useLowercaseFirstComparison = is_string($operand1) && is_string($operand2) && Functions::getCompatibilityMode() == Functions::COMPATIBILITY_OPENOFFICE; - - // execute the necessary operation - switch ($operation) { - // Greater than - case '>': - if ($useLowercaseFirstComparison) { - $result = $this->strcmpLowercaseFirst($operand1, $operand2) > 0; - } else { - $result = ($operand1 > $operand2); - } - - break; - // Less than - case '<': - if ($useLowercaseFirstComparison) { - $result = $this->strcmpLowercaseFirst($operand1, $operand2) < 0; - } else { - $result = ($operand1 < $operand2); - } - - break; - // Equality - case '=': - if (is_numeric($operand1) && is_numeric($operand2)) { - $result = (abs($operand1 - $operand2) < $this->delta); - } else { - $result = $this->strcmpAllowNull($operand1, $operand2) == 0; - } - - break; - // Greater than or equal - case '>=': - if (is_numeric($operand1) && is_numeric($operand2)) { - $result = ((abs($operand1 - $operand2) < $this->delta) || ($operand1 > $operand2)); - } elseif ($useLowercaseFirstComparison) { - $result = $this->strcmpLowercaseFirst($operand1, $operand2) >= 0; - } else { - $result = $this->strcmpAllowNull($operand1, $operand2) >= 0; - } - - break; - // Less than or equal - case '<=': - if (is_numeric($operand1) && is_numeric($operand2)) { - $result = ((abs($operand1 - $operand2) < $this->delta) || ($operand1 < $operand2)); - } elseif ($useLowercaseFirstComparison) { - $result = $this->strcmpLowercaseFirst($operand1, $operand2) <= 0; - } else { - $result = $this->strcmpAllowNull($operand1, $operand2) <= 0; - } - - break; - // Inequality - case '<>': - if (is_numeric($operand1) && is_numeric($operand2)) { - $result = (abs($operand1 - $operand2) > 1E-14); - } else { - $result = $this->strcmpAllowNull($operand1, $operand2) != 0; - } - - break; - - default: - throw new Exception('Unsupported binary comparison operation'); - } + $result = BinaryComparison::compare($operand1, $operand2, $operation); // Log the result details $this->debugLog->writeDebugLog('Evaluation Result is ', $this->showTypeDetails($result)); @@ -5107,35 +5027,6 @@ class Calculation return $result; } - /** - * Compare two strings in the same way as strcmp() except that lowercase come before uppercase letters. - * - * @param null|string $str1 First string value for the comparison - * @param null|string $str2 Second string value for the comparison - * - * @return int - */ - private function strcmpLowercaseFirst($str1, $str2) - { - $inversedStr1 = Shared\StringHelper::strCaseReverse($str1); - $inversedStr2 = Shared\StringHelper::strCaseReverse($str2); - - return strcmp($inversedStr1 ?? '', $inversedStr2 ?? ''); - } - - /** - * PHP8.1 deprecates passing null to strcmp. - * - * @param null|string $str1 First string value for the comparison - * @param null|string $str2 Second string value for the comparison - * - * @return int - */ - private function strcmpAllowNull($str1, $str2) - { - return strcmp($str1 ?? '', $str2 ?? ''); - } - /** * @param mixed $operand1 * @param mixed $operand2 diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTime.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTime.php index 44a38c19e..79fa8dc0b 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTime.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTime.php @@ -278,9 +278,9 @@ class DateTime * or a standard date string * @param mixed $endDate Excel date serial value, PHP date/time stamp, PHP DateTime object * or a standard date string - * @param string $unit + * @param array|string $unit * - * @return int|string Interval between the dates + * @return array|int|string Interval between the dates */ public static function DATEDIF($startDate = 0, $endDate = 0, $unit = 'D') { @@ -300,12 +300,12 @@ class DateTime * @See DateTimeExcel\Days::between() * Use the between method in the DateTimeExcel\Days class instead * - * @param DateTimeInterface|float|int|string $endDate Excel date serial value (float), + * @param array|DateTimeInterface|float|int|string $endDate Excel date serial value (float), * PHP date timestamp (integer), PHP DateTime object, or a standard date string - * @param DateTimeInterface|float|int|string $startDate Excel date serial value (float), + * @param array|DateTimeInterface|float|int|string $startDate Excel date serial value (float), * PHP date timestamp (integer), PHP DateTime object, or a standard date string * - * @return int|string Number of days between start date and end date or an error + * @return array|int|string Number of days between start date and end date or an error */ public static function DAYS($endDate = 0, $startDate = 0) { @@ -331,7 +331,7 @@ class DateTime * PHP DateTime object, or a standard date string * @param mixed $endDate Excel date serial value (float), PHP date timestamp (integer), * PHP DateTime object, or a standard date string - * @param bool $method US or European Method + * @param array|bool $method US or European Method * FALSE or omitted: U.S. (NASD) method. If the starting date is * the last day of a month, it becomes equal to the 30th of the * same month. If the ending date is the last day of a month and @@ -343,7 +343,7 @@ class DateTime * occur on the 31st of a month become equal to the 30th of the * same month. * - * @return int|string Number of days between start date and end date + * @return array|int|string Number of days between start date and end date */ public static function DAYS360($startDate = 0, $endDate = 0, $method = false) { @@ -373,14 +373,14 @@ class DateTime * PHP DateTime object, or a standard date string * @param mixed $endDate Excel date serial value (float), PHP date timestamp (integer), * PHP DateTime object, or a standard date string - * @param int $method Method used for the calculation + * @param array|int $method Method used for the calculation * 0 or omitted US (NASD) 30/360 * 1 Actual/actual * 2 Actual/360 * 3 Actual/365 * 4 European 30/360 * - * @return float|string fraction of the year, or a string containing an error + * @return array|float|string fraction of the year, or a string containing an error */ public static function YEARFRAC($startDate = 0, $endDate = 0, $method = 0) { @@ -409,7 +409,7 @@ class DateTime * PHP DateTime object, or a standard date string * @param mixed $dateArgs * - * @return int|string Interval between the dates + * @return array|int|string Interval between the dates */ public static function NETWORKDAYS($startDate, $endDate, ...$dateArgs) { @@ -464,7 +464,7 @@ class DateTime * @param mixed $dateValue Excel date serial value (float), PHP date timestamp (integer), * PHP DateTime object, or a standard date string * - * @return int|string Day of the month + * @return array|int|string Day of the month */ public static function DAYOFMONTH($dateValue = 1) { @@ -492,7 +492,7 @@ class DateTime * 2 Numbers 1 (Monday) through 7 (Sunday). * 3 Numbers 0 (Monday) through 6 (Sunday). * - * @return int|string Day of the week value + * @return array|int|string Day of the week value */ public static function WEEKDAY($dateValue = 1, $style = 1) { @@ -704,7 +704,7 @@ class DateTime * 17 Week begins on Sunday. * 21 ISO (Jan. 4 is week 1, begins on Monday). * - * @return int|string Week Number + * @return array|int|string Week Number */ public static function WEEKNUM($dateValue = 1, $method = self::STARTWEEK_SUNDAY) { @@ -727,7 +727,7 @@ class DateTime * @param mixed $dateValue Excel date serial value (float), PHP date timestamp (integer), * PHP DateTime object, or a standard date string * - * @return int|string Week Number + * @return array|int|string Week Number */ public static function ISOWEEKNUM($dateValue = 1) { @@ -751,7 +751,7 @@ class DateTime * @param mixed $dateValue Excel date serial value (float), PHP date timestamp (integer), * PHP DateTime object, or a standard date string * - * @return int|string Month of the year + * @return array|int|string Month of the year */ public static function MONTHOFYEAR($dateValue = 1) { @@ -775,7 +775,7 @@ class DateTime * @param mixed $dateValue Excel date serial value (float), PHP date timestamp (integer), * PHP DateTime object, or a standard date string * - * @return int|string Year + * @return array|int|string Year */ public static function YEAR($dateValue = 1) { @@ -799,7 +799,7 @@ class DateTime * @param mixed $timeValue Excel date serial value (float), PHP date timestamp (integer), * PHP DateTime object, or a standard time string * - * @return int|string Hour + * @return array|int|string Hour */ public static function HOUROFDAY($timeValue = 0) { @@ -823,7 +823,7 @@ class DateTime * @param mixed $timeValue Excel date serial value (float), PHP date timestamp (integer), * PHP DateTime object, or a standard time string * - * @return int|string Minute + * @return array|int|string Minute */ public static function MINUTE($timeValue = 0) { @@ -847,7 +847,7 @@ class DateTime * @param mixed $timeValue Excel date serial value (float), PHP date timestamp (integer), * PHP DateTime object, or a standard time string * - * @return int|string Second + * @return array|int|string Second */ public static function SECOND($timeValue = 0) { diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/Date.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/Date.php index d18e2371c..b1c1ece84 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/Date.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/Date.php @@ -2,6 +2,7 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\DateTimeExcel; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception; use PhpOffice\PhpSpreadsheet\Calculation\Functions; use PhpOffice\PhpSpreadsheet\Shared\Date as SharedDateHelper; @@ -9,6 +10,8 @@ use PhpOffice\PhpSpreadsheet\Shared\StringHelper; class Date { + use ArrayEnabled; + /** * DATE. * @@ -24,7 +27,7 @@ class Date * A Month name or abbreviation (English only at this point) such as 'January' or 'Jan' will still be accepted, * as will a day value with a suffix (e.g. '21st' rather than simply 21); again only English language. * - * @param int $year The value of the year argument can include one to four digits. + * @param array|int $year The value of the year argument can include one to four digits. * Excel interprets the year argument according to the configured * date system: 1900 or 1904. * If year is between 0 (zero) and 1899 (inclusive), Excel adds that @@ -35,7 +38,7 @@ class Date * 2008. * If year is less than 0 or is 10000 or greater, Excel returns the * #NUM! error value. - * @param int $month A positive or negative integer representing the month of the year + * @param array|int $month A positive or negative integer representing the month of the year * from 1 to 12 (January to December). * If month is greater than 12, month adds that number of months to * the first month in the year specified. For example, DATE(2008,14,2) @@ -44,7 +47,7 @@ class Date * number of months, plus 1, from the first month in the year * specified. For example, DATE(2008,-3,2) returns the serial number * representing September 2, 2007. - * @param int $day A positive or negative integer representing the day of the month + * @param array|int $day A positive or negative integer representing the day of the month * from 1 to 31. * If day is greater than the number of days in the month specified, * day adds that number of days to the first day in the month. For @@ -57,9 +60,15 @@ class Date * * @return mixed Excel date/time serial value, PHP date/time serial value or PHP date/time object, * depending on the value of the ReturnDateType flag + * If an array of numbers is passed as the argument, then the returned result will also be an array + * with the same dimensions */ public static function fromYMD($year, $month, $day) { + if (is_array($year) || is_array($month) || is_array($day)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $year, $month, $day); + } + $baseYear = SharedDateHelper::getExcelCalendar(); try { @@ -84,7 +93,6 @@ class Date */ private static function getYear($year, int $baseYear): int { - $year = Functions::flattenSingleValue($year); $year = ($year !== null) ? StringHelper::testStringAsNumeric((string) $year) : 0; if (!is_numeric($year)) { throw new Exception(Functions::VALUE()); @@ -112,8 +120,6 @@ class Date */ private static function getMonth($month): int { - $month = Functions::flattenSingleValue($month); - if (($month !== null) && (!is_numeric($month))) { $month = SharedDateHelper::monthStringToNumber($month); } @@ -133,8 +139,6 @@ class Date */ private static function getDay($day): int { - $day = Functions::flattenSingleValue($day); - if (($day !== null) && (!is_numeric($day))) { $day = SharedDateHelper::dayStringToNumber($day); } diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/DateParts.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/DateParts.php index 37ea03151..b669eb0a1 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/DateParts.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/DateParts.php @@ -2,12 +2,15 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\DateTimeExcel; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception; use PhpOffice\PhpSpreadsheet\Calculation\Functions; use PhpOffice\PhpSpreadsheet\Shared\Date as SharedDateHelper; class DateParts { + use ArrayEnabled; + /** * DAYOFMONTH. * @@ -19,11 +22,18 @@ class DateParts * * @param mixed $dateValue Excel date serial value (float), PHP date timestamp (integer), * PHP DateTime object, or a standard date string + * Or can be an array of date values * - * @return int|string Day of the month + * @return array|int|string Day of the month + * If an array of numbers is passed as the argument, then the returned result will also be an array + * with the same dimensions */ public static function day($dateValue) { + if (is_array($dateValue)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $dateValue); + } + $weirdResult = self::weirdCondition($dateValue); if ($weirdResult >= 0) { return $weirdResult; @@ -52,11 +62,18 @@ class DateParts * * @param mixed $dateValue Excel date serial value (float), PHP date timestamp (integer), * PHP DateTime object, or a standard date string + * Or can be an array of date values * - * @return int|string Month of the year + * @return array|int|string Month of the year + * If an array of numbers is passed as the argument, then the returned result will also be an array + * with the same dimensions */ public static function month($dateValue) { + if (is_array($dateValue)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $dateValue); + } + try { $dateValue = Helpers::getDateValue($dateValue); } catch (Exception $e) { @@ -83,11 +100,18 @@ class DateParts * * @param mixed $dateValue Excel date serial value (float), PHP date timestamp (integer), * PHP DateTime object, or a standard date string + * Or can be an array of date values * - * @return int|string Year + * @return array|int|string Year + * If an array of numbers is passed as the argument, then the returned result will also be an array + * with the same dimensions */ public static function year($dateValue) { + if (is_array($dateValue)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $dateValue); + } + try { $dateValue = Helpers::getDateValue($dateValue); } catch (Exception $e) { diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/DateValue.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/DateValue.php index 3b2155062..47a68cf9e 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/DateValue.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/DateValue.php @@ -3,11 +3,14 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\DateTimeExcel; use DateTimeImmutable; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Functions; use PhpOffice\PhpSpreadsheet\Shared\Date as SharedDateHelper; class DateValue { + use ArrayEnabled; + /** * DATEVALUE. * @@ -21,7 +24,7 @@ class DateValue * Excel Function: * DATEVALUE(dateValue) * - * @param string $dateValue Text that represents a date in a Microsoft Excel date format. + * @param array|string $dateValue Text that represents a date in a Microsoft Excel date format. * For example, "1/30/2008" or "30-Jan-2008" are text strings within * quotation marks that represent dates. Using the default date * system in Excel for Windows, date_text must represent a date from @@ -29,15 +32,22 @@ class DateValue * system in Excel for the Macintosh, date_text must represent a date * from January 1, 1904, to December 31, 9999. DATEVALUE returns the * #VALUE! error value if date_text is out of this range. + * Or can be an array of date values * * @return mixed Excel date/time serial value, PHP date/time serial value or PHP date/time object, * depending on the value of the ReturnDateType flag + * If an array of numbers is passed as the argument, then the returned result will also be an array + * with the same dimensions */ public static function fromString($dateValue) { + if (is_array($dateValue)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $dateValue); + } + $dti = new DateTimeImmutable(); $baseYear = SharedDateHelper::getExcelCalendar(); - $dateValue = trim(Functions::flattenSingleValue($dateValue ?? ''), '"'); + $dateValue = trim($dateValue ?? '', '"'); // Strip any ordinals because they're allowed in Excel (English only) $dateValue = preg_replace('/(\d)(st|nd|rd|th)([ -\/])/Ui', '$1$3', $dateValue) ?? ''; // Convert separators (/ . or space) to hyphens (should also handle dot used for ordinals in some countries, e.g. Denmark, Germany) diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/Days.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/Days.php index 5a97d8df8..5392b2c38 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/Days.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/Days.php @@ -3,12 +3,15 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\DateTimeExcel; use DateTimeInterface; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception; use PhpOffice\PhpSpreadsheet\Calculation\Functions; use PhpOffice\PhpSpreadsheet\Shared\Date as SharedDateHelper; class Days { + use ArrayEnabled; + /** * DAYS. * @@ -17,15 +20,23 @@ class Days * Excel Function: * DAYS(endDate, startDate) * - * @param DateTimeInterface|float|int|string $endDate Excel date serial value (float), - * PHP date timestamp (integer), PHP DateTime object, or a standard date string - * @param DateTimeInterface|float|int|string $startDate Excel date serial value (float), - * PHP date timestamp (integer), PHP DateTime object, or a standard date string + * @param array|DateTimeInterface|float|int|string $endDate Excel date serial value (float), + * PHP date timestamp (integer), PHP DateTime object, or a standard date string + * Or can be an array of date values + * @param array|DateTimeInterface|float|int|string $startDate Excel date serial value (float), + * PHP date timestamp (integer), PHP DateTime object, or a standard date string + * Or can be an array of date values * - * @return int|string Number of days between start date and end date or an error + * @return array|int|string Number of days between start date and end date or an error + * If an array of values is passed for the $startDate or $endDays,arguments, then the returned result + * will also be an array with matching dimensions */ public static function between($endDate, $startDate) { + if (is_array($endDate) || is_array($startDate)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $endDate, $startDate); + } + try { $startDate = Helpers::getDateValue($startDate); $endDate = Helpers::getDateValue($endDate); diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/Days360.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/Days360.php index bbc5d16aa..2220aaeec 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/Days360.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/Days360.php @@ -2,12 +2,15 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\DateTimeExcel; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception; use PhpOffice\PhpSpreadsheet\Calculation\Functions; use PhpOffice\PhpSpreadsheet\Shared\Date as SharedDateHelper; class Days360 { + use ArrayEnabled; + /** * DAYS360. * @@ -18,11 +21,13 @@ class Days360 * Excel Function: * DAYS360(startDate,endDate[,method]) * - * @param mixed $startDate Excel date serial value (float), PHP date timestamp (integer), + * @param array|mixed $startDate Excel date serial value (float), PHP date timestamp (integer), * PHP DateTime object, or a standard date string - * @param mixed $endDate Excel date serial value (float), PHP date timestamp (integer), + * Or can be an array of date values + * @param array|mixed $endDate Excel date serial value (float), PHP date timestamp (integer), * PHP DateTime object, or a standard date string - * @param mixed $method US or European Method as a bool + * Or can be an array of date values + * @param array|mixed $method US or European Method as a bool * FALSE or omitted: U.S. (NASD) method. If the starting date is * the last day of a month, it becomes equal to the 30th of the * same month. If the ending date is the last day of a month and @@ -33,11 +38,18 @@ class Days360 * TRUE: European method. Starting dates and ending dates that * occur on the 31st of a month become equal to the 30th of the * same month. + * Or can be an array of methods * - * @return int|string Number of days between start date and end date + * @return array|int|string Number of days between start date and end date + * If an array of values is passed for the $startDate or $endDays,arguments, then the returned result + * will also be an array with matching dimensions */ public static function between($startDate = 0, $endDate = 0, $method = false) { + if (is_array($startDate) || is_array($endDate) || is_array($method)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $startDate, $endDate, $method); + } + try { $startDate = Helpers::getDateValue($startDate); $endDate = Helpers::getDateValue($endDate); diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/Difference.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/Difference.php index 6adeca179..4dd782639 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/Difference.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/Difference.php @@ -4,30 +4,42 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\DateTimeExcel; use DateInterval; use DateTime; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception; use PhpOffice\PhpSpreadsheet\Calculation\Functions; use PhpOffice\PhpSpreadsheet\Shared\Date as SharedDateHelper; class Difference { + use ArrayEnabled; + /** * DATEDIF. * * @param mixed $startDate Excel date serial value, PHP date/time stamp, PHP DateTime object * or a standard date string + * Or can be an array of date values * @param mixed $endDate Excel date serial value, PHP date/time stamp, PHP DateTime object * or a standard date string - * @param string $unit + * Or can be an array of date values + * @param array|string $unit + * Or can be an array of unit values * - * @return int|string Interval between the dates + * @return array|int|string Interval between the dates + * If an array of values is passed for the $startDate or $endDays,arguments, then the returned result + * will also be an array with matching dimensions */ public static function interval($startDate, $endDate, $unit = 'D') { + if (is_array($startDate) || is_array($endDate) || is_array($unit)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $startDate, $endDate, $unit); + } + try { $startDate = Helpers::getDateValue($startDate); $endDate = Helpers::getDateValue($endDate); $difference = self::initialDiff($startDate, $endDate); - $unit = strtoupper(Functions::flattenSingleValue($unit)); + $unit = strtoupper($unit); } catch (Exception $e) { return $e->getMessage(); } diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/Month.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/Month.php index 560b7a807..c72d006b9 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/Month.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/Month.php @@ -2,10 +2,13 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\DateTimeExcel; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception; class Month { + use ArrayEnabled; + /** * EDATE. * @@ -19,15 +22,23 @@ class Month * * @param mixed $dateValue Excel date serial value (float), PHP date timestamp (integer), * PHP DateTime object, or a standard date string - * @param int $adjustmentMonths The number of months before or after start_date. + * Or can be an array of date values + * @param array|int $adjustmentMonths The number of months before or after start_date. * A positive value for months yields a future date; * a negative value yields a past date. + * Or can be an array of adjustment values * - * @return mixed Excel date/time serial value, PHP date/time serial value or PHP date/time object, + * @return array|mixed Excel date/time serial value, PHP date/time serial value or PHP date/time object, * depending on the value of the ReturnDateType flag + * If an array of values is passed as the argument, then the returned result will also be an array + * with the same dimensions */ public static function adjust($dateValue, $adjustmentMonths) { + if (is_array($dateValue) || is_array($adjustmentMonths)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $dateValue, $adjustmentMonths); + } + try { $dateValue = Helpers::getDateValue($dateValue, false); $adjustmentMonths = Helpers::validateNumericNull($adjustmentMonths); @@ -54,15 +65,23 @@ class Month * * @param mixed $dateValue Excel date serial value (float), PHP date timestamp (integer), * PHP DateTime object, or a standard date string - * @param int $adjustmentMonths The number of months before or after start_date. + * Or can be an array of date values + * @param array|int $adjustmentMonths The number of months before or after start_date. * A positive value for months yields a future date; * a negative value yields a past date. + * Or can be an array of adjustment values * - * @return mixed Excel date/time serial value, PHP date/time serial value or PHP date/time object, + * @return array|mixed Excel date/time serial value, PHP date/time serial value or PHP date/time object, * depending on the value of the ReturnDateType flag + * If an array of values is passed as the argument, then the returned result will also be an array + * with the same dimensions */ public static function lastDay($dateValue, $adjustmentMonths) { + if (is_array($dateValue) || is_array($adjustmentMonths)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $dateValue, $adjustmentMonths); + } + try { $dateValue = Helpers::getDateValue($dateValue, false); $adjustmentMonths = Helpers::validateNumericNull($adjustmentMonths); diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/NetworkDays.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/NetworkDays.php index d0f53cf39..3b8942baf 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/NetworkDays.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/NetworkDays.php @@ -2,11 +2,14 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\DateTimeExcel; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception; use PhpOffice\PhpSpreadsheet\Calculation\Functions; class NetworkDays { + use ArrayEnabled; + /** * NETWORKDAYS. * @@ -20,14 +23,28 @@ class NetworkDays * * @param mixed $startDate Excel date serial value (float), PHP date timestamp (integer), * PHP DateTime object, or a standard date string + * Or can be an array of date values * @param mixed $endDate Excel date serial value (float), PHP date timestamp (integer), * PHP DateTime object, or a standard date string - * @param mixed $dateArgs + * Or can be an array of date values + * @param mixed $dateArgs An array of dates (such as holidays) to exclude from the calculation * - * @return int|string Interval between the dates + * @return array|int|string Interval between the dates + * If an array of values is passed for the $startDate or $endDate arguments, then the returned result + * will also be an array with matching dimensions */ public static function count($startDate, $endDate, ...$dateArgs) { + if (is_array($startDate) || is_array($endDate)) { + return self::evaluateArrayArgumentsSubset( + [self::class, __FUNCTION__], + 2, + $startDate, + $endDate, + ...$dateArgs + ); + } + try { // Retrieve the mandatory start and end date that are referenced in the function definition $sDate = Helpers::getDateValue($startDate); diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/Time.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/Time.php index fb5e49652..f5e685f49 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/Time.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/Time.php @@ -3,12 +3,15 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\DateTimeExcel; use DateTime; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception; use PhpOffice\PhpSpreadsheet\Calculation\Functions; use PhpOffice\PhpSpreadsheet\Shared\Date as SharedDateHelper; class Time { + use ArrayEnabled; + /** * TIME. * @@ -20,23 +23,31 @@ class Time * Excel Function: * TIME(hour,minute,second) * - * @param mixed $hour A number from 0 (zero) to 32767 representing the hour. + * @param array|int $hour A number from 0 (zero) to 32767 representing the hour. * Any value greater than 23 will be divided by 24 and the remainder * will be treated as the hour value. For example, TIME(27,0,0) = * TIME(3,0,0) = .125 or 3:00 AM. - * @param mixed $minute A number from 0 to 32767 representing the minute. + * @param array|int $minute A number from 0 to 32767 representing the minute. * Any value greater than 59 will be converted to hours and minutes. * For example, TIME(0,750,0) = TIME(12,30,0) = .520833 or 12:30 PM. - * @param mixed $second A number from 0 to 32767 representing the second. + * @param array|int $second A number from 0 to 32767 representing the second. * Any value greater than 59 will be converted to hours, minutes, * and seconds. For example, TIME(0,0,2000) = TIME(0,33,22) = .023148 * or 12:33:20 AM + * If an array of numbers is passed as the argument, then the returned result will also be an array + * with the same dimensions * - * @return mixed Excel date/time serial value, PHP date/time serial value or PHP date/time object, + * @return array|mixed Excel date/time serial value, PHP date/time serial value or PHP date/time object, * depending on the value of the ReturnDateType flag + * If an array of numbers is passed as the argument, then the returned result will also be an array + * with the same dimensions */ public static function fromHMS($hour, $minute, $second) { + if (is_array($hour) || is_array($minute) || is_array($second)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $hour, $minute, $second); + } + try { $hour = self::toIntWithNullBool($hour); $minute = self::toIntWithNullBool($minute); @@ -105,7 +116,6 @@ class Time */ private static function toIntWithNullBool($value): int { - $value = Functions::flattenSingleValue($value); $value = $value ?? 0; if (is_bool($value)) { $value = (int) $value; diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/TimeParts.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/TimeParts.php index 49cd983d8..d9b99f3c3 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/TimeParts.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/TimeParts.php @@ -2,12 +2,14 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\DateTimeExcel; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception; -use PhpOffice\PhpSpreadsheet\Calculation\Functions; use PhpOffice\PhpSpreadsheet\Shared\Date as SharedDateHelper; class TimeParts { + use ArrayEnabled; + /** * HOUROFDAY. * @@ -19,13 +21,19 @@ class TimeParts * * @param mixed $timeValue Excel date serial value (float), PHP date timestamp (integer), * PHP DateTime object, or a standard time string + * Or can be an array of date/time values * - * @return int|string Hour + * @return array|int|string Hour + * If an array of numbers is passed as the argument, then the returned result will also be an array + * with the same dimensions */ public static function hour($timeValue) { + if (is_array($timeValue)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $timeValue); + } + try { - $timeValue = Functions::flattenSingleValue($timeValue); Helpers::nullFalseTrueToNumber($timeValue); if (!is_numeric($timeValue)) { $timeValue = Helpers::getTimeValue($timeValue); @@ -53,13 +61,19 @@ class TimeParts * * @param mixed $timeValue Excel date serial value (float), PHP date timestamp (integer), * PHP DateTime object, or a standard time string + * Or can be an array of date/time values * - * @return int|string Minute + * @return array|int|string Minute + * If an array of numbers is passed as the argument, then the returned result will also be an array + * with the same dimensions */ public static function minute($timeValue) { + if (is_array($timeValue)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $timeValue); + } + try { - $timeValue = Functions::flattenSingleValue($timeValue); Helpers::nullFalseTrueToNumber($timeValue); if (!is_numeric($timeValue)) { $timeValue = Helpers::getTimeValue($timeValue); @@ -87,13 +101,19 @@ class TimeParts * * @param mixed $timeValue Excel date serial value (float), PHP date timestamp (integer), * PHP DateTime object, or a standard time string + * Or can be an array of date/time values * - * @return int|string Second + * @return array|int|string Second + * If an array of numbers is passed as the argument, then the returned result will also be an array + * with the same dimensions */ public static function second($timeValue) { + if (is_array($timeValue)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $timeValue); + } + try { - $timeValue = Functions::flattenSingleValue($timeValue); Helpers::nullFalseTrueToNumber($timeValue); if (!is_numeric($timeValue)) { $timeValue = Helpers::getTimeValue($timeValue); diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/TimeValue.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/TimeValue.php index c9645e665..f57c9f005 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/TimeValue.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/TimeValue.php @@ -3,11 +3,14 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\DateTimeExcel; use Datetime; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Functions; use PhpOffice\PhpSpreadsheet\Shared\Date as SharedDateHelper; class TimeValue { + use ArrayEnabled; + /** * TIMEVALUE. * @@ -21,17 +24,24 @@ class TimeValue * Excel Function: * TIMEVALUE(timeValue) * - * @param string $timeValue A text string that represents a time in any one of the Microsoft + * @param array|string $timeValue A text string that represents a time in any one of the Microsoft * Excel time formats; for example, "6:45 PM" and "18:45" text strings * within quotation marks that represent time. * Date information in time_text is ignored. + * Or can be an array of date/time values * * @return mixed Excel date/time serial value, PHP date/time serial value or PHP date/time object, * depending on the value of the ReturnDateType flag + * If an array of numbers is passed as the argument, then the returned result will also be an array + * with the same dimensions */ public static function fromString($timeValue) { - $timeValue = trim(Functions::flattenSingleValue($timeValue ?? ''), '"'); + if (is_array($timeValue)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $timeValue); + } + + $timeValue = trim($timeValue ?? '', '"'); $timeValue = str_replace(['/', '.'], '-', $timeValue); $arraySplit = preg_split('/[\/:\-\s]/', $timeValue) ?: []; diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/Week.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/Week.php index 663622210..c6ca0f816 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/Week.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/Week.php @@ -3,12 +3,15 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\DateTimeExcel; use DateTime; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception; use PhpOffice\PhpSpreadsheet\Calculation\Functions; use PhpOffice\PhpSpreadsheet\Shared\Date as SharedDateHelper; class Week { + use ArrayEnabled; + /** * WEEKNUM. * @@ -24,7 +27,8 @@ class Week * * @param mixed $dateValue Excel date serial value (float), PHP date timestamp (integer), * PHP DateTime object, or a standard date string - * @param int $method Week begins on Sunday or Monday + * Or can be an array of date values + * @param array|int $method Week begins on Sunday or Monday * 1 or omitted Week begins on Sunday. * 2 Week begins on Monday. * 11 Week begins on Monday. @@ -35,11 +39,18 @@ class Week * 16 Week begins on Saturday. * 17 Week begins on Sunday. * 21 ISO (Jan. 4 is week 1, begins on Monday). + * Or can be an array of methods * - * @return int|string Week Number + * @return array|int|string Week Number + * If an array of values is passed as the argument, then the returned result will also be an array + * with the same dimensions */ public static function number($dateValue, $method = Constants::STARTWEEK_SUNDAY) { + if (is_array($dateValue) || is_array($method)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $dateValue, $method); + } + $origDateValueNull = empty($dateValue); try { @@ -88,11 +99,18 @@ class Week * * @param mixed $dateValue Excel date serial value (float), PHP date timestamp (integer), * PHP DateTime object, or a standard date string + * Or can be an array of date values * - * @return int|string Week Number + * @return array|int|string Week Number + * If an array of numbers is passed as the argument, then the returned result will also be an array + * with the same dimensions */ public static function isoWeekNumber($dateValue) { + if (is_array($dateValue)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $dateValue); + } + if (self::apparentBug($dateValue)) { return 52; } @@ -119,17 +137,25 @@ class Week * Excel Function: * WEEKDAY(dateValue[,style]) * - * @param null|float|int|string $dateValue Excel date serial value (float), PHP date timestamp (integer), + * @param null|array|float|int|string $dateValue Excel date serial value (float), PHP date timestamp (integer), * PHP DateTime object, or a standard date string + * Or can be an array of date values * @param mixed $style A number that determines the type of return value * 1 or omitted Numbers 1 (Sunday) through 7 (Saturday). * 2 Numbers 1 (Monday) through 7 (Sunday). * 3 Numbers 0 (Monday) through 6 (Sunday). + * Or can be an array of styles * - * @return int|string Day of the week value + * @return array|int|string Day of the week value + * If an array of values is passed as the argument, then the returned result will also be an array + * with the same dimensions */ public static function day($dateValue, $style = 1) { + if (is_array($dateValue) || is_array($style)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $dateValue, $style); + } + try { $dateValue = Helpers::getDateValue($dateValue); $style = self::validateStyle($style); @@ -165,8 +191,6 @@ class Week */ private static function validateStyle($style): int { - $style = Functions::flattenSingleValue($style); - if (!is_numeric($style)) { throw new Exception(Functions::VALUE()); } @@ -225,7 +249,7 @@ class Week if ($method === null) { $method = Constants::STARTWEEK_SUNDAY; } - $method = Functions::flattenSingleValue($method); + if (!is_numeric($method)) { throw new Exception(Functions::VALUE()); } diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/WorkDay.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/WorkDay.php index 89e47b969..1f5735e8e 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/WorkDay.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/WorkDay.php @@ -2,11 +2,14 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\DateTimeExcel; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception; use PhpOffice\PhpSpreadsheet\Calculation\Functions; class WorkDay { + use ArrayEnabled; + /** * WORKDAY. * @@ -18,27 +21,37 @@ class WorkDay * Excel Function: * WORKDAY(startDate,endDays[,holidays[,holiday[,...]]]) * - * @param mixed $startDate Excel date serial value (float), PHP date timestamp (integer), + * @param array|mixed $startDate Excel date serial value (float), PHP date timestamp (integer), * PHP DateTime object, or a standard date string - * @param int $endDays The number of nonweekend and nonholiday days before or after + * Or can be an array of date values + * @param array|int $endDays The number of nonweekend and nonholiday days before or after * startDate. A positive value for days yields a future date; a * negative value yields a past date. - * @param mixed $dateArgs + * Or can be an array of int values + * @param null|mixed $dateArgs An array of dates (such as holidays) to exclude from the calculation * - * @return mixed Excel date/time serial value, PHP date/time serial value or PHP date/time object, + * @return array|mixed Excel date/time serial value, PHP date/time serial value or PHP date/time object, * depending on the value of the ReturnDateType flag + * If an array of values is passed for the $startDate or $endDays,arguments, then the returned result + * will also be an array with matching dimensions */ public static function date($startDate, $endDays, ...$dateArgs) { + if (is_array($startDate) || is_array($endDays)) { + return self::evaluateArrayArgumentsSubset( + [self::class, __FUNCTION__], + 2, + $startDate, + $endDays, + ...$dateArgs + ); + } + // Retrieve the mandatory start date and days that are referenced in the function definition try { $startDate = Helpers::getDateValue($startDate); $endDays = Helpers::validateNumericNull($endDays); - $dateArgs = Functions::flattenArray($dateArgs); - $holidayArray = []; - foreach ($dateArgs as $holidayDate) { - $holidayArray[] = Helpers::getDateValue($holidayDate); - } + $holidayArray = array_map([Helpers::class, 'getDateValue'], Functions::flattenArray($dateArgs)); } catch (Exception $e) { return $e->getMessage(); } @@ -64,9 +77,8 @@ class WorkDay private static function incrementing(float $startDate, int $endDays, array $holidayArray) { // Adjust the start date if it falls over a weekend - $startDoW = self::getWeekDay($startDate, 3); - if (self::getWeekDay($startDate, 3) >= 5) { + if ($startDoW >= 5) { $startDate += 7 - $startDoW; --$endDays; } @@ -126,9 +138,8 @@ class WorkDay private static function decrementing(float $startDate, int $endDays, array $holidayArray) { // Adjust the start date if it falls over a weekend - $startDoW = self::getWeekDay($startDate, 3); - if (self::getWeekDay($startDate, 3) >= 5) { + if ($startDoW >= 5) { $startDate += -$startDoW + 4; ++$endDays; } @@ -172,6 +183,7 @@ class WorkDay } // Adjust the calculated end date if it falls over a weekend $endDoW = self::getWeekDay($endDate, 3); + /** int $endDoW */ if ($endDoW >= 5) { $endDate += -$endDoW + 4; } @@ -182,8 +194,8 @@ class WorkDay private static function getWeekDay(float $date, int $wd): int { - $result = Week::day($date, $wd); + $result = Functions::scalar(Week::day($date, $wd)); - return is_string($result) ? -1 : $result; + return is_int($result) ? $result : -1; } } diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/YearFrac.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/YearFrac.php index da2ac12fc..8dad16d8c 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/YearFrac.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/YearFrac.php @@ -2,12 +2,15 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\DateTimeExcel; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception; use PhpOffice\PhpSpreadsheet\Calculation\Functions; use PhpOffice\PhpSpreadsheet\Shared\Date as SharedDateHelper; class YearFrac { + use ArrayEnabled; + /** * YEARFRAC. * @@ -23,19 +26,28 @@ class YearFrac * * @param mixed $startDate Excel date serial value (float), PHP date timestamp (integer), * PHP DateTime object, or a standard date string + * Or can be an array of values * @param mixed $endDate Excel date serial value (float), PHP date timestamp (integer), * PHP DateTime object, or a standard date string - * @param int $method Method used for the calculation + * Or can be an array of methods + * @param array|int $method Method used for the calculation * 0 or omitted US (NASD) 30/360 * 1 Actual/actual * 2 Actual/360 * 3 Actual/365 * 4 European 30/360 + * Or can be an array of methods * - * @return float|string fraction of the year, or a string containing an error + * @return array|float|string fraction of the year, or a string containing an error + * If an array of values is passed for the $startDate or $endDays,arguments, then the returned result + * will also be an array with matching dimensions */ public static function fraction($startDate, $endDate, $method = 0) { + if (is_array($startDate) || is_array($endDate) || is_array($method)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $startDate, $endDate, $method); + } + try { $method = (int) Helpers::validateNumericNull($method); $sDate = Helpers::getDateValue($startDate); @@ -50,15 +62,15 @@ class YearFrac switch ($method) { case 0: - return Days360::between($startDate, $endDate) / 360; + return Functions::scalar(Days360::between($startDate, $endDate)) / 360; case 1: return self::method1($startDate, $endDate); case 2: - return Difference::interval($startDate, $endDate) / 360; + return Functions::scalar(Difference::interval($startDate, $endDate)) / 360; case 3: - return Difference::interval($startDate, $endDate) / 365; + return Functions::scalar(Difference::interval($startDate, $endDate)) / 365; case 4: - return Days360::between($startDate, $endDate, true) / 360; + return Functions::scalar(Days360::between($startDate, $endDate, true)) / 360; } return Functions::NAN(); @@ -87,7 +99,7 @@ class YearFrac private static function method1(float $startDate, float $endDate): float { - $days = Difference::interval($startDate, $endDate); + $days = Functions::scalar(Difference::interval($startDate, $endDate)); $startYear = (int) DateParts::year($startDate); $endYear = (int) DateParts::year($endDate); $years = $endYear - $startYear + 1; diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engine/ArrayArgumentHelper.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engine/ArrayArgumentHelper.php new file mode 100644 index 000000000..df413f209 --- /dev/null +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engine/ArrayArgumentHelper.php @@ -0,0 +1,202 @@ +rows = $this->rows($arguments); + $this->columns = $this->columns($arguments); + + $this->argumentCount = count($arguments); + $this->arguments = $this->flattenSingleCellArrays($arguments, $this->rows, $this->columns); + + $this->rows = $this->rows($arguments); + $this->columns = $this->columns($arguments); + + if ($this->arrayArguments() > 2) { + throw new Exception('Formulae with more than two array arguments are not supported'); + } + } + + public function arguments(): array + { + return $this->arguments; + } + + public function hasArrayArgument(): bool + { + return $this->arrayArguments() > 0; + } + + public function getFirstArrayArgumentNumber(): int + { + $rowArrays = $this->filterArray($this->rows); + $columnArrays = $this->filterArray($this->columns); + + for ($index = 0; $index < $this->argumentCount; ++$index) { + if (isset($rowArrays[$index]) || isset($columnArrays[$index])) { + return ++$index; + } + } + + return 0; + } + + public function getSingleRowVector(): ?int + { + $rowVectors = $this->getRowVectors(); + + return count($rowVectors) === 1 ? array_pop($rowVectors) : null; + } + + private function getRowVectors(): array + { + $rowVectors = []; + for ($index = 0; $index < $this->argumentCount; ++$index) { + if ($this->rows[$index] === 1 && $this->columns[$index] > 1) { + $rowVectors[] = $index; + } + } + + return $rowVectors; + } + + public function getSingleColumnVector(): ?int + { + $columnVectors = $this->getColumnVectors(); + + return count($columnVectors) === 1 ? array_pop($columnVectors) : null; + } + + private function getColumnVectors(): array + { + $columnVectors = []; + for ($index = 0; $index < $this->argumentCount; ++$index) { + if ($this->rows[$index] > 1 && $this->columns[$index] === 1) { + $columnVectors[] = $index; + } + } + + return $columnVectors; + } + + public function getMatrixPair(): array + { + for ($i = 0; $i < ($this->argumentCount - 1); ++$i) { + for ($j = $i + 1; $j < $this->argumentCount; ++$j) { + if (isset($this->rows[$i], $this->rows[$j])) { + return [$i, $j]; + } + } + } + + return []; + } + + public function isVector(int $argument): bool + { + return $this->rows[$argument] === 1 || $this->columns[$argument] === 1; + } + + public function isRowVector(int $argument): bool + { + return $this->rows[$argument] === 1; + } + + public function isColumnVector(int $argument): bool + { + return $this->columns[$argument] === 1; + } + + public function rowCount(int $argument): int + { + return $this->rows[$argument]; + } + + public function columnCount(int $argument): int + { + return $this->columns[$argument]; + } + + private function rows(array $arguments): array + { + return array_map( + function ($argument) { + return is_countable($argument) ? count($argument) : 1; + }, + $arguments + ); + } + + private function columns(array $arguments): array + { + return array_map( + function ($argument) { + return is_array($argument) && is_array($argument[array_keys($argument)[0]]) + ? count($argument[array_keys($argument)[0]]) + : 1; + }, + $arguments + ); + } + + public function arrayArguments(): int + { + $count = 0; + foreach (array_keys($this->arguments) as $argument) { + if ($this->rows[$argument] > 1 || $this->columns[$argument] > 1) { + ++$count; + } + } + + return $count; + } + + private function flattenSingleCellArrays(array $arguments, array $rows, array $columns): array + { + foreach ($arguments as $index => $argument) { + if ($rows[$index] === 1 && $columns[$index] === 1) { + while (is_array($argument)) { + $argument = array_pop($argument); + } + $arguments[$index] = $argument; + } + } + + return $arguments; + } + + private function filterArray(array $array): array + { + return array_filter( + $array, + function ($value) { + return $value > 1; + } + ); + } +} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engine/ArrayArgumentProcessor.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engine/ArrayArgumentProcessor.php new file mode 100644 index 000000000..4e377fe52 --- /dev/null +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engine/ArrayArgumentProcessor.php @@ -0,0 +1,174 @@ +hasArrayArgument() === false) { + return [$method(...$arguments)]; + } + + if (self::$arrayArgumentHelper->arrayArguments() === 1) { + $nthArgument = self::$arrayArgumentHelper->getFirstArrayArgumentNumber(); + + return self::evaluateNthArgumentAsArray($method, $nthArgument, ...$arguments); + } + + $singleRowVectorIndex = self::$arrayArgumentHelper->getSingleRowVector(); + $singleColumnVectorIndex = self::$arrayArgumentHelper->getSingleColumnVector(); + if ($singleRowVectorIndex !== null && $singleColumnVectorIndex !== null) { + // Basic logic for a single row vector and a single column vector + return self::evaluateVectorPair($method, $singleRowVectorIndex, $singleColumnVectorIndex, ...$arguments); + } + + $matrixPair = self::$arrayArgumentHelper->getMatrixPair(); + if ($matrixPair !== []) { + if ( + (self::$arrayArgumentHelper->isVector($matrixPair[0]) === true && + self::$arrayArgumentHelper->isVector($matrixPair[1]) === false) || + (self::$arrayArgumentHelper->isVector($matrixPair[0]) === false && + self::$arrayArgumentHelper->isVector($matrixPair[1]) === true) + ) { + // Logic for a matrix and a vector (row or column) + return self::evaluateVectorMatrixPair($method, $matrixPair, ...$arguments); + } + // Logic for matrix/matrix, column vector/column vector or row vector/row vector + return self::evaluateMatrixPair($method, $matrixPair, ...$arguments); + } + + // Still need to work out the logic for more than two array arguments, + // For the moment, we're throwing an Exception when we initialise the ArrayArgumentHelper + return ['#VALUE!']; + } + + /** + * @param mixed ...$arguments + */ + private static function evaluateVectorMatrixPair(callable $method, array $matrixIndexes, ...$arguments): array + { + $matrix2 = array_pop($matrixIndexes); + /** @var array $matrixValues2 */ + $matrixValues2 = $arguments[$matrix2]; + $matrix1 = array_pop($matrixIndexes); + /** @var array $matrixValues1 */ + $matrixValues1 = $arguments[$matrix1]; + + $rows = min(array_map([self::$arrayArgumentHelper, 'rowCount'], [$matrix1, $matrix2])); + $columns = min(array_map([self::$arrayArgumentHelper, 'columnCount'], [$matrix1, $matrix2])); + + if ($rows === 1) { + $rows = max(array_map([self::$arrayArgumentHelper, 'rowCount'], [$matrix1, $matrix2])); + } + if ($columns === 1) { + $columns = max(array_map([self::$arrayArgumentHelper, 'columnCount'], [$matrix1, $matrix2])); + } + + $result = []; + for ($rowIndex = 0; $rowIndex < $rows; ++$rowIndex) { + for ($columnIndex = 0; $columnIndex < $columns; ++$columnIndex) { + $rowIndex1 = self::$arrayArgumentHelper->isRowVector($matrix1) ? 0 : $rowIndex; + $columnIndex1 = self::$arrayArgumentHelper->isColumnVector($matrix1) ? 0 : $columnIndex; + $value1 = $matrixValues1[$rowIndex1][$columnIndex1]; + $rowIndex2 = self::$arrayArgumentHelper->isRowVector($matrix2) ? 0 : $rowIndex; + $columnIndex2 = self::$arrayArgumentHelper->isColumnVector($matrix2) ? 0 : $columnIndex; + $value2 = $matrixValues2[$rowIndex2][$columnIndex2]; + $arguments[$matrix1] = $value1; + $arguments[$matrix2] = $value2; + + $result[$rowIndex][$columnIndex] = $method(...$arguments); + } + } + + return $result; + } + + /** + * @param mixed ...$arguments + */ + private static function evaluateMatrixPair(callable $method, array $matrixIndexes, ...$arguments): array + { + $matrix2 = array_pop($matrixIndexes); + /** @var array $matrixValues2 */ + $matrixValues2 = $arguments[$matrix2]; + $matrix1 = array_pop($matrixIndexes); + /** @var array $matrixValues1 */ + $matrixValues1 = $arguments[$matrix1]; + + $result = []; + foreach ($matrixValues1 as $rowIndex => $row) { + foreach ($row as $columnIndex => $value1) { + if (isset($matrixValues2[$rowIndex][$columnIndex]) === false) { + continue; + } + + $value2 = $matrixValues2[$rowIndex][$columnIndex]; + $arguments[$matrix1] = $value1; + $arguments[$matrix2] = $value2; + + $result[$rowIndex][$columnIndex] = $method(...$arguments); + } + } + + return $result; + } + + /** + * @param mixed ...$arguments + */ + private static function evaluateVectorPair(callable $method, int $rowIndex, int $columnIndex, ...$arguments): array + { + $rowVector = Functions::flattenArray($arguments[$rowIndex]); + $columnVector = Functions::flattenArray($arguments[$columnIndex]); + + $result = []; + foreach ($columnVector as $column) { + $rowResults = []; + foreach ($rowVector as $row) { + $arguments[$rowIndex] = $row; + $arguments[$columnIndex] = $column; + + $rowResults[] = $method(...$arguments); + } + $result[] = $rowResults; + } + + return $result; + } + + /** + * Note, offset is from 1 (for the first argument) rather than from 0. + * + * @param mixed ...$arguments + */ + private static function evaluateNthArgumentAsArray(callable $method, int $nthArgument, ...$arguments): array + { + $values = array_slice($arguments, $nthArgument - 1, 1); + /** @var array $values */ + $values = array_pop($values); + + $result = []; + foreach ($values as $value) { + $arguments[$nthArgument - 1] = $value; + $result[] = $method(...$arguments); + } + + return $result; + } +} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering.php index a70ddac5c..d70b32d6a 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering.php @@ -61,7 +61,7 @@ class Engineering * If $ord is nonnumeric, BESSELI returns the #VALUE! error value. * If $ord < 0, BESSELI returns the #NUM! error value. * - * @return float|string Result, or a string containing an error + * @return array|float|string Result, or a string containing an error */ public static function BESSELI($x, $ord) { @@ -86,7 +86,7 @@ class Engineering * If $ord is nonnumeric, BESSELJ returns the #VALUE! error value. * If $ord < 0, BESSELJ returns the #NUM! error value. * - * @return float|string Result, or a string containing an error + * @return array|float|string Result, or a string containing an error */ public static function BESSELJ($x, $ord) { @@ -112,7 +112,7 @@ class Engineering * If $ord is nonnumeric, BESSELK returns the #VALUE! error value. * If $ord < 0, BESSELK returns the #NUM! error value. * - * @return float|string Result, or a string containing an error + * @return array|float|string Result, or a string containing an error */ public static function BESSELK($x, $ord) { @@ -137,7 +137,7 @@ class Engineering * If $ord is nonnumeric, BESSELY returns the #VALUE! error value. * If $ord < 0, BESSELY returns the #NUM! error value. * - * @return float|string Result, or a string containing an error + * @return array|float|string Result, or a string containing an error */ public static function BESSELY($x, $ord) { @@ -163,7 +163,7 @@ class Engineering * If number is not a valid binary number, or if number contains more than * 10 characters (10 bits), BIN2DEC returns the #NUM! error value. * - * @return string + * @return array|string */ public static function BINTODEC($x) { @@ -195,7 +195,7 @@ class Engineering * If places is nonnumeric, BIN2HEX returns the #VALUE! error value. * If places is negative, BIN2HEX returns the #NUM! error value. * - * @return string + * @return array|string */ public static function BINTOHEX($x, $places = null) { @@ -227,7 +227,7 @@ class Engineering * If places is nonnumeric, BIN2OCT returns the #VALUE! error value. * If places is negative, BIN2OCT returns the #NUM! error value. * - * @return string + * @return array|string */ public static function BINTOOCT($x, $places = null) { @@ -263,7 +263,7 @@ class Engineering * If places is nonnumeric, DEC2BIN returns the #VALUE! error value. * If places is zero or negative, DEC2BIN returns the #NUM! error value. * - * @return string + * @return array|string */ public static function DECTOBIN($x, $places = null) { @@ -299,7 +299,7 @@ class Engineering * If places is nonnumeric, DEC2HEX returns the #VALUE! error value. * If places is zero or negative, DEC2HEX returns the #NUM! error value. * - * @return string + * @return array|string */ public static function DECTOHEX($x, $places = null) { @@ -335,7 +335,7 @@ class Engineering * If places is nonnumeric, DEC2OCT returns the #VALUE! error value. * If places is zero or negative, DEC2OCT returns the #NUM! error value. * - * @return string + * @return array|string */ public static function DECTOOCT($x, $places = null) { @@ -371,7 +371,7 @@ class Engineering * If places is nonnumeric, HEX2BIN returns the #VALUE! error value. * If places is negative, HEX2BIN returns the #NUM! error value. * - * @return string + * @return array|string */ public static function HEXTOBIN($x, $places = null) { @@ -398,7 +398,7 @@ class Engineering * If number is not a valid hexadecimal number, HEX2DEC returns the * #NUM! error value. * - * @return string + * @return array|string */ public static function HEXTODEC($x) { @@ -438,7 +438,7 @@ class Engineering * value. * If places is negative, HEX2OCT returns the #NUM! error value. * - * @return string + * @return array|string */ public static function HEXTOOCT($x, $places = null) { @@ -480,7 +480,7 @@ class Engineering * If places is negative, OCT2BIN returns the #NUM! error * value. * - * @return string + * @return array|string */ public static function OCTTOBIN($x, $places = null) { @@ -507,7 +507,7 @@ class Engineering * If number is not a valid octal number, OCT2DEC returns the * #NUM! error value. * - * @return string + * @return array|string */ public static function OCTTODEC($x) { @@ -544,7 +544,7 @@ class Engineering * If places is nonnumeric, OCT2HEX returns the #VALUE! error value. * If places is negative, OCT2HEX returns the #NUM! error value. * - * @return string + * @return array|string */ public static function OCTTOHEX($x, $places = null) { @@ -563,12 +563,12 @@ class Engineering * * @see Use the COMPLEX() method in the Engineering\Complex class instead * - * @param float $realNumber the real coefficient of the complex number - * @param float $imaginary the imaginary coefficient of the complex number - * @param string $suffix The suffix for the imaginary component of the complex number. + * @param array|float $realNumber the real coefficient of the complex number + * @param array|float $imaginary the imaginary coefficient of the complex number + * @param array|string $suffix The suffix for the imaginary component of the complex number. * If omitted, the suffix is assumed to be "i". * - * @return string + * @return array|string */ public static function COMPLEX($realNumber = 0.0, $imaginary = 0.0, $suffix = 'i') { @@ -590,7 +590,7 @@ class Engineering * @param string $complexNumber the complex number for which you want the imaginary * coefficient * - * @return float|string + * @return array|float|string */ public static function IMAGINARY($complexNumber) { @@ -611,7 +611,7 @@ class Engineering * * @param string $complexNumber the complex number for which you want the real coefficient * - * @return float|string + * @return array|float|string */ public static function IMREAL($complexNumber) { @@ -632,7 +632,7 @@ class Engineering * * @param string $complexNumber the complex number for which you want the absolute value * - * @return float|string + * @return array|float|string */ public static function IMABS($complexNumber) { @@ -652,9 +652,9 @@ class Engineering * * @see Use the IMARGUMENT() method in the Engineering\ComplexFunctions class instead * - * @param string $complexNumber the complex number for which you want the argument theta + * @param array|string $complexNumber the complex number for which you want the argument theta * - * @return float|string + * @return array|float|string */ public static function IMARGUMENT($complexNumber) { @@ -673,9 +673,9 @@ class Engineering * * @see Use the IMARGUMENT() method in the Engineering\ComplexFunctions class instead * - * @param string $complexNumber the complex number for which you want the conjugate + * @param array|string $complexNumber the complex number for which you want the conjugate * - * @return string + * @return array|string */ public static function IMCONJUGATE($complexNumber) { @@ -694,9 +694,9 @@ class Engineering * * @see Use the IMCOS() method in the Engineering\ComplexFunctions class instead * - * @param string $complexNumber the complex number for which you want the cosine + * @param array|string $complexNumber the complex number for which you want the cosine * - * @return float|string + * @return array|float|string */ public static function IMCOS($complexNumber) { @@ -715,9 +715,9 @@ class Engineering * * @see Use the IMCOSH() method in the Engineering\ComplexFunctions class instead * - * @param string $complexNumber the complex number for which you want the hyperbolic cosine + * @param array|string $complexNumber the complex number for which you want the hyperbolic cosine * - * @return float|string + * @return array|float|string */ public static function IMCOSH($complexNumber) { @@ -736,9 +736,9 @@ class Engineering * * @see Use the IMCOT() method in the Engineering\ComplexFunctions class instead * - * @param string $complexNumber the complex number for which you want the cotangent + * @param array|string $complexNumber the complex number for which you want the cotangent * - * @return float|string + * @return array|float|string */ public static function IMCOT($complexNumber) { @@ -757,9 +757,9 @@ class Engineering * * @see Use the IMCSC() method in the Engineering\ComplexFunctions class instead * - * @param string $complexNumber the complex number for which you want the cosecant + * @param array|string $complexNumber the complex number for which you want the cosecant * - * @return float|string + * @return array|float|string */ public static function IMCSC($complexNumber) { @@ -778,9 +778,9 @@ class Engineering * * @see Use the IMCSCH() method in the Engineering\ComplexFunctions class instead * - * @param string $complexNumber the complex number for which you want the hyperbolic cosecant + * @param array|string $complexNumber the complex number for which you want the hyperbolic cosecant * - * @return float|string + * @return array|float|string */ public static function IMCSCH($complexNumber) { @@ -801,7 +801,7 @@ class Engineering * * @param string $complexNumber the complex number for which you want the sine * - * @return float|string + * @return array|float|string */ public static function IMSIN($complexNumber) { @@ -822,7 +822,7 @@ class Engineering * * @param string $complexNumber the complex number for which you want the hyperbolic sine * - * @return float|string + * @return array|float|string */ public static function IMSINH($complexNumber) { @@ -843,7 +843,7 @@ class Engineering * * @param string $complexNumber the complex number for which you want the secant * - * @return float|string + * @return array|float|string */ public static function IMSEC($complexNumber) { @@ -864,7 +864,7 @@ class Engineering * * @param string $complexNumber the complex number for which you want the hyperbolic secant * - * @return float|string + * @return array|float|string */ public static function IMSECH($complexNumber) { @@ -885,7 +885,7 @@ class Engineering * * @param string $complexNumber the complex number for which you want the tangent * - * @return float|string + * @return array|float|string */ public static function IMTAN($complexNumber) { @@ -906,7 +906,7 @@ class Engineering * * @param string $complexNumber the complex number for which you want the square root * - * @return string + * @return array|string */ public static function IMSQRT($complexNumber) { @@ -927,7 +927,7 @@ class Engineering * * @param string $complexNumber the complex number for which you want the natural logarithm * - * @return string + * @return array|string */ public static function IMLN($complexNumber) { @@ -948,7 +948,7 @@ class Engineering * * @param string $complexNumber the complex number for which you want the common logarithm * - * @return string + * @return array|string */ public static function IMLOG10($complexNumber) { @@ -969,7 +969,7 @@ class Engineering * * @param string $complexNumber the complex number for which you want the base-2 logarithm * - * @return string + * @return array|string */ public static function IMLOG2($complexNumber) { @@ -990,7 +990,7 @@ class Engineering * * @param string $complexNumber the complex number for which you want the exponential * - * @return string + * @return array|string */ public static function IMEXP($complexNumber) { @@ -1012,7 +1012,7 @@ class Engineering * @param string $complexNumber the complex number you want to raise to a power * @param float $realNumber the power to which you want to raise the complex number * - * @return string + * @return array|string */ public static function IMPOWER($complexNumber, $realNumber) { @@ -1034,7 +1034,7 @@ class Engineering * @param string $complexDividend the complex numerator or dividend * @param string $complexDivisor the complex denominator or divisor * - * @return string + * @return array|string */ public static function IMDIV($complexDividend, $complexDivisor) { @@ -1056,7 +1056,7 @@ class Engineering * @param string $complexNumber1 the complex number from which to subtract complexNumber2 * @param string $complexNumber2 the complex number to subtract from complexNumber1 * - * @return string + * @return array|string */ public static function IMSUB($complexNumber1, $complexNumber2) { @@ -1123,7 +1123,7 @@ class Engineering * @param float $a the first number * @param float $b The second number. If omitted, b is assumed to be zero. * - * @return int|string (string in the event of an error) + * @return array|int|string (string in the event of an error) */ public static function DELTA($a, $b = 0) { @@ -1147,7 +1147,7 @@ class Engineering * @param float $number the value to test against step * @param float $step The threshold value. If you omit a value for step, GESTEP uses zero. * - * @return int|string (string in the event of an error) + * @return array|int|string (string in the event of an error) */ public static function GESTEP($number, $step = 0) { @@ -1169,7 +1169,7 @@ class Engineering * @param int $number1 * @param int $number2 * - * @return int|string + * @return array|int|string */ public static function BITAND($number1, $number2) { @@ -1191,7 +1191,7 @@ class Engineering * @param int $number1 * @param int $number2 * - * @return int|string + * @return array|int|string */ public static function BITOR($number1, $number2) { @@ -1213,7 +1213,7 @@ class Engineering * @param int $number1 * @param int $number2 * - * @return int|string + * @return array|int|string */ public static function BITXOR($number1, $number2) { @@ -1235,7 +1235,7 @@ class Engineering * @param int $number * @param int $shiftAmount * - * @return int|string + * @return array|float|int|string */ public static function BITLSHIFT($number, $shiftAmount) { @@ -1257,7 +1257,7 @@ class Engineering * @param int $number * @param int $shiftAmount * - * @return int|string + * @return array|float|int|string */ public static function BITRSHIFT($number, $shiftAmount) { @@ -1285,7 +1285,7 @@ class Engineering * @param float $upper upper bound for integrating ERF. * If omitted, ERF integrates between zero and lower_limit * - * @return float|string + * @return array|float|string */ public static function ERF($lower, $upper = null) { @@ -1306,7 +1306,7 @@ class Engineering * * @param float $limit bound for integrating ERF * - * @return float|string + * @return array|float|string */ public static function ERFPRECISE($limit) { @@ -1332,7 +1332,7 @@ class Engineering * * @param float $x The lower bound for integrating ERFC * - * @return float|string + * @return array|float|string */ public static function ERFC($x) { @@ -1437,7 +1437,7 @@ class Engineering * @param string $fromUOM the units for value * @param string $toUOM the units for the result * - * @return float|string + * @return array|float|string */ public static function CONVERTUOM($value, $fromUOM, $toUOM) { diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/BesselI.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/BesselI.php index ea2577cdf..24145aa9d 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/BesselI.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/BesselI.php @@ -2,11 +2,14 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\Engineering; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception; use PhpOffice\PhpSpreadsheet\Calculation\Functions; class BesselI { + use ArrayEnabled; + /** * BESSELI. * @@ -21,17 +24,22 @@ class BesselI * * @param mixed $x A float value at which to evaluate the function. * If x is nonnumeric, BESSELI returns the #VALUE! error value. + * Or can be an array of values * @param mixed $ord The integer order of the Bessel function. * If ord is not an integer, it is truncated. * If $ord is nonnumeric, BESSELI returns the #VALUE! error value. * If $ord < 0, BESSELI returns the #NUM! error value. + * Or can be an array of values * - * @return float|string Result, or a string containing an error + * @return array|float|string Result, or a string containing an error + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function BESSELI($x, $ord) { - $x = Functions::flattenSingleValue($x); - $ord = Functions::flattenSingleValue($ord); + if (is_array($x) || is_array($ord)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $x, $ord); + } try { $x = EngineeringValidations::validateFloat($x); diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/BesselJ.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/BesselJ.php index 7ea45a74f..4b6a79e94 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/BesselJ.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/BesselJ.php @@ -2,11 +2,14 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\Engineering; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception; use PhpOffice\PhpSpreadsheet\Calculation\Functions; class BesselJ { + use ArrayEnabled; + /** * BESSELJ. * @@ -20,17 +23,22 @@ class BesselJ * * @param mixed $x A float value at which to evaluate the function. * If x is nonnumeric, BESSELJ returns the #VALUE! error value. + * Or can be an array of values * @param mixed $ord The integer order of the Bessel function. * If ord is not an integer, it is truncated. * If $ord is nonnumeric, BESSELJ returns the #VALUE! error value. * If $ord < 0, BESSELJ returns the #NUM! error value. + * Or can be an array of values * - * @return float|string Result, or a string containing an error + * @return array|float|string Result, or a string containing an error + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function BESSELJ($x, $ord) { - $x = Functions::flattenSingleValue($x); - $ord = Functions::flattenSingleValue($ord); + if (is_array($x) || is_array($ord)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $x, $ord); + } try { $x = EngineeringValidations::validateFloat($x); diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/BesselK.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/BesselK.php index 8facdffc7..977eadf80 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/BesselK.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/BesselK.php @@ -2,11 +2,14 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\Engineering; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception; use PhpOffice\PhpSpreadsheet\Calculation\Functions; class BesselK { + use ArrayEnabled; + /** * BESSELK. * @@ -18,17 +21,22 @@ class BesselK * * @param mixed $x A float value at which to evaluate the function. * If x is nonnumeric, BESSELK returns the #VALUE! error value. + * Or can be an array of values * @param mixed $ord The integer order of the Bessel function. * If ord is not an integer, it is truncated. * If $ord is nonnumeric, BESSELK returns the #VALUE! error value. * If $ord < 0, BESSELKI returns the #NUM! error value. + * Or can be an array of values * - * @return float|string Result, or a string containing an error + * @return array|float|string Result, or a string containing an error + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function BESSELK($x, $ord) { - $x = Functions::flattenSingleValue($x); - $ord = Functions::flattenSingleValue($ord); + if (is_array($x) || is_array($ord)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $x, $ord); + } try { $x = EngineeringValidations::validateFloat($x); diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/BesselY.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/BesselY.php index 7f3874971..2b373bd2a 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/BesselY.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/BesselY.php @@ -2,11 +2,14 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\Engineering; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception; use PhpOffice\PhpSpreadsheet\Calculation\Functions; class BesselY { + use ArrayEnabled; + /** * BESSELY. * @@ -17,17 +20,22 @@ class BesselY * * @param mixed $x A float value at which to evaluate the function. * If x is nonnumeric, BESSELY returns the #VALUE! error value. + * Or can be an array of values * @param mixed $ord The integer order of the Bessel function. * If ord is not an integer, it is truncated. * If $ord is nonnumeric, BESSELY returns the #VALUE! error value. * If $ord < 0, BESSELY returns the #NUM! error value. + * Or can be an array of values * - * @return float|string Result, or a string containing an error + * @return array|float|string Result, or a string containing an error + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function BESSELY($x, $ord) { - $x = Functions::flattenSingleValue($x); - $ord = Functions::flattenSingleValue($ord); + if (is_array($x) || is_array($ord)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $x, $ord); + } try { $x = EngineeringValidations::validateFloat($x); diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/BitWise.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/BitWise.php index 9958f054f..3041a41c4 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/BitWise.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/BitWise.php @@ -2,11 +2,14 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\Engineering; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception; use PhpOffice\PhpSpreadsheet\Calculation\Functions; class BitWise { + use ArrayEnabled; + const SPLIT_DIVISOR = 2 ** 24; /** @@ -27,13 +30,21 @@ class BitWise * Excel Function: * BITAND(number1, number2) * - * @param int $number1 - * @param int $number2 + * @param array|int $number1 + * Or can be an array of values + * @param array|int $number2 + * Or can be an array of values * - * @return int|string + * @return array|int|string + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function BITAND($number1, $number2) { + if (is_array($number1) || is_array($number2)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $number1, $number2); + } + try { $number1 = self::validateBitwiseArgument($number1); $number2 = self::validateBitwiseArgument($number2); @@ -54,13 +65,21 @@ class BitWise * Excel Function: * BITOR(number1, number2) * - * @param int $number1 - * @param int $number2 + * @param array|int $number1 + * Or can be an array of values + * @param array|int $number2 + * Or can be an array of values * - * @return int|string + * @return array|int|string + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function BITOR($number1, $number2) { + if (is_array($number1) || is_array($number2)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $number1, $number2); + } + try { $number1 = self::validateBitwiseArgument($number1); $number2 = self::validateBitwiseArgument($number2); @@ -82,13 +101,21 @@ class BitWise * Excel Function: * BITXOR(number1, number2) * - * @param int $number1 - * @param int $number2 + * @param array|int $number1 + * Or can be an array of values + * @param array|int $number2 + * Or can be an array of values * - * @return int|string + * @return array|int|string + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function BITXOR($number1, $number2) { + if (is_array($number1) || is_array($number2)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $number1, $number2); + } + try { $number1 = self::validateBitwiseArgument($number1); $number2 = self::validateBitwiseArgument($number2); @@ -110,13 +137,21 @@ class BitWise * Excel Function: * BITLSHIFT(number, shift_amount) * - * @param int $number - * @param int $shiftAmount + * @param array|int $number + * Or can be an array of values + * @param array|int $shiftAmount + * Or can be an array of values * - * @return float|int|string + * @return array|float|int|string + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function BITLSHIFT($number, $shiftAmount) { + if (is_array($number) || is_array($shiftAmount)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $number, $shiftAmount); + } + try { $number = self::validateBitwiseArgument($number); $shiftAmount = self::validateShiftAmount($shiftAmount); @@ -140,13 +175,21 @@ class BitWise * Excel Function: * BITRSHIFT(number, shift_amount) * - * @param int $number - * @param int $shiftAmount + * @param array|int $number + * Or can be an array of values + * @param array|int $shiftAmount + * Or can be an array of values * - * @return float|int|string + * @return array|float|int|string + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function BITRSHIFT($number, $shiftAmount) { + if (is_array($number) || is_array($shiftAmount)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $number, $shiftAmount); + } + try { $number = self::validateBitwiseArgument($number); $shiftAmount = self::validateShiftAmount($shiftAmount); @@ -171,7 +214,7 @@ class BitWise */ private static function validateBitwiseArgument($value) { - self::nullFalseTrueToNumber($value); + $value = self::nullFalseTrueToNumber($value); if (is_numeric($value)) { if ($value == floor($value)) { @@ -197,7 +240,7 @@ class BitWise */ private static function validateShiftAmount($value) { - self::nullFalseTrueToNumber($value); + $value = self::nullFalseTrueToNumber($value); if (is_numeric($value)) { if (abs($value) > 53) { @@ -214,14 +257,17 @@ class BitWise * Many functions accept null/false/true argument treated as 0/0/1. * * @param mixed $number + * + * @return mixed */ - public static function nullFalseTrueToNumber(&$number): void + private static function nullFalseTrueToNumber(&$number) { - $number = Functions::flattenSingleValue($number); if ($number === null) { $number = 0; } elseif (is_bool($number)) { $number = (int) $number; } + + return $number; } } diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/Compare.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/Compare.php index 0a6342069..4d4bc07e3 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/Compare.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/Compare.php @@ -2,11 +2,13 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\Engineering; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception; -use PhpOffice\PhpSpreadsheet\Calculation\Functions; class Compare { + use ArrayEnabled; + /** * DELTA. * @@ -18,15 +20,20 @@ class Compare * functions you calculate the count of equal pairs. This function is also known as the * Kronecker Delta function. * - * @param float $a the first number - * @param float $b The second number. If omitted, b is assumed to be zero. + * @param array|float $a the first number + * Or can be an array of values + * @param array|float $b The second number. If omitted, b is assumed to be zero. + * Or can be an array of values * - * @return int|string (string in the event of an error) + * @return array|int|string (string in the event of an error) + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ - public static function DELTA($a, $b = 0) + public static function DELTA($a, $b = 0.0) { - $a = Functions::flattenSingleValue($a); - $b = Functions::flattenSingleValue($b); + if (is_array($a) || is_array($b)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $a, $b); + } try { $a = EngineeringValidations::validateFloat($a); @@ -35,7 +42,7 @@ class Compare return $e->getMessage(); } - return (int) ($a == $b); + return (int) (abs($a - $b) < 1.0e-15); } /** @@ -48,15 +55,20 @@ class Compare * Use this function to filter a set of values. For example, by summing several GESTEP * functions you calculate the count of values that exceed a threshold. * - * @param float $number the value to test against step - * @param float $step The threshold value. If you omit a value for step, GESTEP uses zero. + * @param array|float $number the value to test against step + * Or can be an array of values + * @param array|float $step The threshold value. If you omit a value for step, GESTEP uses zero. + * Or can be an array of values * - * @return int|string (string in the event of an error) + * @return array|int|string (string in the event of an error) + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ - public static function GESTEP($number, $step = 0) + public static function GESTEP($number, $step = 0.0) { - $number = Functions::flattenSingleValue($number); - $step = Functions::flattenSingleValue($step); + if (is_array($number) || is_array($step)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $number, $step); + } try { $number = EngineeringValidations::validateFloat($number); diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/Complex.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/Complex.php index 1c2f5f773..37bc08769 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/Complex.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/Complex.php @@ -4,11 +4,14 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\Engineering; use Complex\Complex as ComplexObject; use Complex\Exception as ComplexException; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception; use PhpOffice\PhpSpreadsheet\Calculation\Functions; class Complex { + use ArrayEnabled; + /** * COMPLEX. * @@ -18,17 +21,26 @@ class Complex * COMPLEX(realNumber,imaginary[,suffix]) * * @param mixed $realNumber the real float coefficient of the complex number + * Or can be an array of values * @param mixed $imaginary the imaginary float coefficient of the complex number + * Or can be an array of values * @param mixed $suffix The character suffix for the imaginary component of the complex number. * If omitted, the suffix is assumed to be "i". + * Or can be an array of values * - * @return string + * @return array|string + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function COMPLEX($realNumber = 0.0, $imaginary = 0.0, $suffix = 'i') { - $realNumber = ($realNumber === null) ? 0.0 : Functions::flattenSingleValue($realNumber); - $imaginary = ($imaginary === null) ? 0.0 : Functions::flattenSingleValue($imaginary); - $suffix = ($suffix === null) ? 'i' : Functions::flattenSingleValue($suffix); + if (is_array($realNumber) || is_array($imaginary) || is_array($suffix)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $realNumber, $imaginary, $suffix); + } + + $realNumber = $realNumber ?? 0.0; + $imaginary = $imaginary ?? 0.0; + $suffix = $suffix ?? 'i'; try { $realNumber = EngineeringValidations::validateFloat($realNumber); @@ -54,14 +66,19 @@ class Complex * Excel Function: * IMAGINARY(complexNumber) * - * @param string $complexNumber the complex number for which you want the imaginary + * @param array|string $complexNumber the complex number for which you want the imaginary * coefficient + * Or can be an array of values * - * @return float|string + * @return array|float|string (string if an error) + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function IMAGINARY($complexNumber) { - $complexNumber = Functions::flattenSingleValue($complexNumber); + if (is_array($complexNumber)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $complexNumber); + } try { $complex = new ComplexObject($complexNumber); @@ -80,13 +97,18 @@ class Complex * Excel Function: * IMREAL(complexNumber) * - * @param string $complexNumber the complex number for which you want the real coefficient + * @param array|string $complexNumber the complex number for which you want the real coefficient + * Or can be an array of values * - * @return float|string + * @return array|float|string (string if an error) + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function IMREAL($complexNumber) { - $complexNumber = Functions::flattenSingleValue($complexNumber); + if (is_array($complexNumber)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $complexNumber); + } try { $complex = new ComplexObject($complexNumber); diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/ComplexFunctions.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/ComplexFunctions.php index 3f37f373f..f05d4bd8c 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/ComplexFunctions.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/ComplexFunctions.php @@ -4,10 +4,13 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\Engineering; use Complex\Complex as ComplexObject; use Complex\Exception as ComplexException; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Functions; class ComplexFunctions { + use ArrayEnabled; + /** * IMABS. * @@ -16,13 +19,18 @@ class ComplexFunctions * Excel Function: * IMABS(complexNumber) * - * @param string $complexNumber the complex number for which you want the absolute value + * @param array|string $complexNumber the complex number for which you want the absolute value + * Or can be an array of values * - * @return float|string + * @return array|float|string + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function IMABS($complexNumber) { - $complexNumber = Functions::flattenSingleValue($complexNumber); + if (is_array($complexNumber)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $complexNumber); + } try { $complex = new ComplexObject($complexNumber); @@ -42,13 +50,18 @@ class ComplexFunctions * Excel Function: * IMARGUMENT(complexNumber) * - * @param string $complexNumber the complex number for which you want the argument theta + * @param array|string $complexNumber the complex number for which you want the argument theta + * Or can be an array of values * - * @return float|string + * @return array|float|string + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function IMARGUMENT($complexNumber) { - $complexNumber = Functions::flattenSingleValue($complexNumber); + if (is_array($complexNumber)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $complexNumber); + } try { $complex = new ComplexObject($complexNumber); @@ -71,13 +84,18 @@ class ComplexFunctions * Excel Function: * IMCONJUGATE(complexNumber) * - * @param string $complexNumber the complex number for which you want the conjugate + * @param array|string $complexNumber the complex number for which you want the conjugate + * Or can be an array of values * - * @return string + * @return array|string + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function IMCONJUGATE($complexNumber) { - $complexNumber = Functions::flattenSingleValue($complexNumber); + if (is_array($complexNumber)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $complexNumber); + } try { $complex = new ComplexObject($complexNumber); @@ -96,13 +114,18 @@ class ComplexFunctions * Excel Function: * IMCOS(complexNumber) * - * @param string $complexNumber the complex number for which you want the cosine + * @param array|string $complexNumber the complex number for which you want the cosine + * Or can be an array of values * - * @return float|string + * @return array|float|string + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function IMCOS($complexNumber) { - $complexNumber = Functions::flattenSingleValue($complexNumber); + if (is_array($complexNumber)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $complexNumber); + } try { $complex = new ComplexObject($complexNumber); @@ -121,13 +144,18 @@ class ComplexFunctions * Excel Function: * IMCOSH(complexNumber) * - * @param string $complexNumber the complex number for which you want the hyperbolic cosine + * @param array|string $complexNumber the complex number for which you want the hyperbolic cosine + * Or can be an array of values * - * @return float|string + * @return array|float|string + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function IMCOSH($complexNumber) { - $complexNumber = Functions::flattenSingleValue($complexNumber); + if (is_array($complexNumber)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $complexNumber); + } try { $complex = new ComplexObject($complexNumber); @@ -146,13 +174,18 @@ class ComplexFunctions * Excel Function: * IMCOT(complexNumber) * - * @param string $complexNumber the complex number for which you want the cotangent + * @param array|string $complexNumber the complex number for which you want the cotangent + * Or can be an array of values * - * @return float|string + * @return array|float|string + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function IMCOT($complexNumber) { - $complexNumber = Functions::flattenSingleValue($complexNumber); + if (is_array($complexNumber)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $complexNumber); + } try { $complex = new ComplexObject($complexNumber); @@ -171,13 +204,18 @@ class ComplexFunctions * Excel Function: * IMCSC(complexNumber) * - * @param string $complexNumber the complex number for which you want the cosecant + * @param array|string $complexNumber the complex number for which you want the cosecant + * Or can be an array of values * - * @return float|string + * @return array|float|string + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function IMCSC($complexNumber) { - $complexNumber = Functions::flattenSingleValue($complexNumber); + if (is_array($complexNumber)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $complexNumber); + } try { $complex = new ComplexObject($complexNumber); @@ -196,13 +234,18 @@ class ComplexFunctions * Excel Function: * IMCSCH(complexNumber) * - * @param string $complexNumber the complex number for which you want the hyperbolic cosecant + * @param array|string $complexNumber the complex number for which you want the hyperbolic cosecant + * Or can be an array of values * - * @return float|string + * @return array|float|string + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function IMCSCH($complexNumber) { - $complexNumber = Functions::flattenSingleValue($complexNumber); + if (is_array($complexNumber)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $complexNumber); + } try { $complex = new ComplexObject($complexNumber); @@ -221,13 +264,18 @@ class ComplexFunctions * Excel Function: * IMSIN(complexNumber) * - * @param string $complexNumber the complex number for which you want the sine + * @param array|string $complexNumber the complex number for which you want the sine + * Or can be an array of values * - * @return float|string + * @return array|float|string + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function IMSIN($complexNumber) { - $complexNumber = Functions::flattenSingleValue($complexNumber); + if (is_array($complexNumber)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $complexNumber); + } try { $complex = new ComplexObject($complexNumber); @@ -246,13 +294,18 @@ class ComplexFunctions * Excel Function: * IMSINH(complexNumber) * - * @param string $complexNumber the complex number for which you want the hyperbolic sine + * @param array|string $complexNumber the complex number for which you want the hyperbolic sine + * Or can be an array of values * - * @return float|string + * @return array|float|string + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function IMSINH($complexNumber) { - $complexNumber = Functions::flattenSingleValue($complexNumber); + if (is_array($complexNumber)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $complexNumber); + } try { $complex = new ComplexObject($complexNumber); @@ -271,13 +324,18 @@ class ComplexFunctions * Excel Function: * IMSEC(complexNumber) * - * @param string $complexNumber the complex number for which you want the secant + * @param array|string $complexNumber the complex number for which you want the secant + * Or can be an array of values * - * @return float|string + * @return array|float|string + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function IMSEC($complexNumber) { - $complexNumber = Functions::flattenSingleValue($complexNumber); + if (is_array($complexNumber)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $complexNumber); + } try { $complex = new ComplexObject($complexNumber); @@ -296,13 +354,18 @@ class ComplexFunctions * Excel Function: * IMSECH(complexNumber) * - * @param string $complexNumber the complex number for which you want the hyperbolic secant + * @param array|string $complexNumber the complex number for which you want the hyperbolic secant + * Or can be an array of values * - * @return float|string + * @return array|float|string + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function IMSECH($complexNumber) { - $complexNumber = Functions::flattenSingleValue($complexNumber); + if (is_array($complexNumber)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $complexNumber); + } try { $complex = new ComplexObject($complexNumber); @@ -321,13 +384,18 @@ class ComplexFunctions * Excel Function: * IMTAN(complexNumber) * - * @param string $complexNumber the complex number for which you want the tangent + * @param array|string $complexNumber the complex number for which you want the tangent + * Or can be an array of values * - * @return float|string + * @return array|float|string + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function IMTAN($complexNumber) { - $complexNumber = Functions::flattenSingleValue($complexNumber); + if (is_array($complexNumber)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $complexNumber); + } try { $complex = new ComplexObject($complexNumber); @@ -346,13 +414,18 @@ class ComplexFunctions * Excel Function: * IMSQRT(complexNumber) * - * @param string $complexNumber the complex number for which you want the square root + * @param array|string $complexNumber the complex number for which you want the square root + * Or can be an array of values * - * @return string + * @return array|string + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function IMSQRT($complexNumber) { - $complexNumber = Functions::flattenSingleValue($complexNumber); + if (is_array($complexNumber)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $complexNumber); + } try { $complex = new ComplexObject($complexNumber); @@ -376,13 +449,18 @@ class ComplexFunctions * Excel Function: * IMLN(complexNumber) * - * @param string $complexNumber the complex number for which you want the natural logarithm + * @param array|string $complexNumber the complex number for which you want the natural logarithm + * Or can be an array of values * - * @return string + * @return array|string + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function IMLN($complexNumber) { - $complexNumber = Functions::flattenSingleValue($complexNumber); + if (is_array($complexNumber)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $complexNumber); + } try { $complex = new ComplexObject($complexNumber); @@ -405,13 +483,18 @@ class ComplexFunctions * Excel Function: * IMLOG10(complexNumber) * - * @param string $complexNumber the complex number for which you want the common logarithm + * @param array|string $complexNumber the complex number for which you want the common logarithm + * Or can be an array of values * - * @return string + * @return array|string + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function IMLOG10($complexNumber) { - $complexNumber = Functions::flattenSingleValue($complexNumber); + if (is_array($complexNumber)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $complexNumber); + } try { $complex = new ComplexObject($complexNumber); @@ -434,13 +517,18 @@ class ComplexFunctions * Excel Function: * IMLOG2(complexNumber) * - * @param string $complexNumber the complex number for which you want the base-2 logarithm + * @param array|string $complexNumber the complex number for which you want the base-2 logarithm + * Or can be an array of values * - * @return string + * @return array|string + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function IMLOG2($complexNumber) { - $complexNumber = Functions::flattenSingleValue($complexNumber); + if (is_array($complexNumber)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $complexNumber); + } try { $complex = new ComplexObject($complexNumber); @@ -463,13 +551,18 @@ class ComplexFunctions * Excel Function: * IMEXP(complexNumber) * - * @param string $complexNumber the complex number for which you want the exponential + * @param array|string $complexNumber the complex number for which you want the exponential + * Or can be an array of values * - * @return string + * @return array|string + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function IMEXP($complexNumber) { - $complexNumber = Functions::flattenSingleValue($complexNumber); + if (is_array($complexNumber)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $complexNumber); + } try { $complex = new ComplexObject($complexNumber); @@ -488,15 +581,20 @@ class ComplexFunctions * Excel Function: * IMPOWER(complexNumber,realNumber) * - * @param string $complexNumber the complex number you want to raise to a power - * @param float $realNumber the power to which you want to raise the complex number + * @param array|string $complexNumber the complex number you want to raise to a power + * Or can be an array of values + * @param array|float|int|string $realNumber the power to which you want to raise the complex number + * Or can be an array of values * - * @return string + * @return array|string + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function IMPOWER($complexNumber, $realNumber) { - $complexNumber = Functions::flattenSingleValue($complexNumber); - $realNumber = Functions::flattenSingleValue($realNumber); + if (is_array($complexNumber) || is_array($realNumber)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $complexNumber, $realNumber); + } try { $complex = new ComplexObject($complexNumber); @@ -508,6 +606,6 @@ class ComplexFunctions return Functions::VALUE(); } - return (string) $complex->pow($realNumber); + return (string) $complex->pow((float) $realNumber); } } diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/ComplexOperations.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/ComplexOperations.php index 681aad8ca..a921be61e 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/ComplexOperations.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/ComplexOperations.php @@ -4,10 +4,13 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\Engineering; use Complex\Complex as ComplexObject; use Complex\Exception as ComplexException; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Functions; class ComplexOperations { + use ArrayEnabled; + /** * IMDIV. * @@ -16,15 +19,20 @@ class ComplexOperations * Excel Function: * IMDIV(complexDividend,complexDivisor) * - * @param string $complexDividend the complex numerator or dividend - * @param string $complexDivisor the complex denominator or divisor + * @param array|string $complexDividend the complex numerator or dividend + * Or can be an array of values + * @param array|string $complexDivisor the complex denominator or divisor + * Or can be an array of values * - * @return string + * @return array|string + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function IMDIV($complexDividend, $complexDivisor) { - $complexDividend = Functions::flattenSingleValue($complexDividend); - $complexDivisor = Functions::flattenSingleValue($complexDivisor); + if (is_array($complexDividend) || is_array($complexDivisor)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $complexDividend, $complexDivisor); + } try { return (string) (new ComplexObject($complexDividend))->divideby(new ComplexObject($complexDivisor)); @@ -41,15 +49,20 @@ class ComplexOperations * Excel Function: * IMSUB(complexNumber1,complexNumber2) * - * @param string $complexNumber1 the complex number from which to subtract complexNumber2 - * @param string $complexNumber2 the complex number to subtract from complexNumber1 + * @param array|string $complexNumber1 the complex number from which to subtract complexNumber2 + * Or can be an array of values + * @param array|string $complexNumber2 the complex number to subtract from complexNumber1 + * Or can be an array of values * - * @return string + * @return array|string + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function IMSUB($complexNumber1, $complexNumber2) { - $complexNumber1 = Functions::flattenSingleValue($complexNumber1); - $complexNumber2 = Functions::flattenSingleValue($complexNumber2); + if (is_array($complexNumber1) || is_array($complexNumber2)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $complexNumber1, $complexNumber2); + } try { return (string) (new ComplexObject($complexNumber1))->subtract(new ComplexObject($complexNumber2)); diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/ConvertBase.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/ConvertBase.php index a095690d1..4a7419750 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/ConvertBase.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/ConvertBase.php @@ -2,11 +2,14 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\Engineering; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception; use PhpOffice\PhpSpreadsheet\Calculation\Functions; -class ConvertBase +abstract class ConvertBase { + use ArrayEnabled; + protected static function validateValue($value): string { if (is_bool($value)) { diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/ConvertBinary.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/ConvertBinary.php index a662b78de..5f1be4546 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/ConvertBinary.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/ConvertBinary.php @@ -15,17 +15,26 @@ class ConvertBinary extends ConvertBase * Excel Function: * BIN2DEC(x) * - * @param string $value The binary number (as a string) that you want to convert. The number + * @param array|string $value The binary number (as a string) that you want to convert. The number * cannot contain more than 10 characters (10 bits). The most significant * bit of number is the sign bit. The remaining 9 bits are magnitude bits. * Negative numbers are represented using two's-complement notation. * If number is not a valid binary number, or if number contains more than * 10 characters (10 bits), BIN2DEC returns the #NUM! error value. + * Or can be an array of values + * + * @return array|string Result, or an error + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ - public static function toDecimal($value): string + public static function toDecimal($value) { + if (is_array($value)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $value); + } + try { - $value = self::validateValue(Functions::flattenSingleValue($value)); + $value = self::validateValue($value); $value = self::validateBinary($value); } catch (Exception $e) { return $e->getMessage(); @@ -49,25 +58,35 @@ class ConvertBinary extends ConvertBase * Excel Function: * BIN2HEX(x[,places]) * - * @param string $value The binary number (as a string) that you want to convert. The number + * @param array|string $value The binary number (as a string) that you want to convert. The number * cannot contain more than 10 characters (10 bits). The most significant * bit of number is the sign bit. The remaining 9 bits are magnitude bits. * Negative numbers are represented using two's-complement notation. * If number is not a valid binary number, or if number contains more than * 10 characters (10 bits), BIN2HEX returns the #NUM! error value. - * @param int $places The number of characters to use. If places is omitted, BIN2HEX uses the + * Or can be an array of values + * @param array|int $places The number of characters to use. If places is omitted, BIN2HEX uses the * minimum number of characters necessary. Places is useful for padding the * return value with leading 0s (zeros). * If places is not an integer, it is truncated. * If places is nonnumeric, BIN2HEX returns the #VALUE! error value. * If places is negative, BIN2HEX returns the #NUM! error value. + * Or can be an array of values + * + * @return array|string Result, or an error + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ - public static function toHex($value, $places = null): string + public static function toHex($value, $places = null) { + if (is_array($value) || is_array($places)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $places); + } + try { - $value = self::validateValue(Functions::flattenSingleValue($value)); + $value = self::validateValue($value); $value = self::validateBinary($value); - $places = self::validatePlaces(Functions::flattenSingleValue($places)); + $places = self::validatePlaces($places); } catch (Exception $e) { return $e->getMessage(); } @@ -92,25 +111,35 @@ class ConvertBinary extends ConvertBase * Excel Function: * BIN2OCT(x[,places]) * - * @param string $value The binary number (as a string) that you want to convert. The number + * @param array|string $value The binary number (as a string) that you want to convert. The number * cannot contain more than 10 characters (10 bits). The most significant * bit of number is the sign bit. The remaining 9 bits are magnitude bits. * Negative numbers are represented using two's-complement notation. * If number is not a valid binary number, or if number contains more than * 10 characters (10 bits), BIN2OCT returns the #NUM! error value. - * @param int $places The number of characters to use. If places is omitted, BIN2OCT uses the + * Or can be an array of values + * @param array|int $places The number of characters to use. If places is omitted, BIN2OCT uses the * minimum number of characters necessary. Places is useful for padding the * return value with leading 0s (zeros). * If places is not an integer, it is truncated. * If places is nonnumeric, BIN2OCT returns the #VALUE! error value. * If places is negative, BIN2OCT returns the #NUM! error value. + * Or can be an array of values + * + * @return array|string Result, or an error + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ - public static function toOctal($value, $places = null): string + public static function toOctal($value, $places = null) { + if (is_array($value) || is_array($places)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $places); + } + try { - $value = self::validateValue(Functions::flattenSingleValue($value)); + $value = self::validateValue($value); $value = self::validateBinary($value); - $places = self::validatePlaces(Functions::flattenSingleValue($places)); + $places = self::validatePlaces($places); } catch (Exception $e) { return $e->getMessage(); } diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/ConvertDecimal.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/ConvertDecimal.php index a34332fb3..6a8767865 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/ConvertDecimal.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/ConvertDecimal.php @@ -22,7 +22,7 @@ class ConvertDecimal extends ConvertBase * Excel Function: * DEC2BIN(x[,places]) * - * @param string $value The decimal integer you want to convert. If number is negative, + * @param array|string $value The decimal integer you want to convert. If number is negative, * valid place values are ignored and DEC2BIN returns a 10-character * (10-bit) binary number in which the most significant bit is the sign * bit. The remaining 9 bits are magnitude bits. Negative numbers are @@ -32,19 +32,29 @@ class ConvertDecimal extends ConvertBase * If number is nonnumeric, DEC2BIN returns the #VALUE! error value. * If DEC2BIN requires more than places characters, it returns the #NUM! * error value. - * @param int $places The number of characters to use. If places is omitted, DEC2BIN uses + * Or can be an array of values + * @param array|int $places The number of characters to use. If places is omitted, DEC2BIN uses * the minimum number of characters necessary. Places is useful for * padding the return value with leading 0s (zeros). * If places is not an integer, it is truncated. * If places is nonnumeric, DEC2BIN returns the #VALUE! error value. * If places is zero or negative, DEC2BIN returns the #NUM! error value. + * Or can be an array of values + * + * @return array|string Result, or an error + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ - public static function toBinary($value, $places = null): string + public static function toBinary($value, $places = null) { + if (is_array($value) || is_array($places)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $places); + } + try { - $value = self::validateValue(Functions::flattenSingleValue($value)); + $value = self::validateValue($value); $value = self::validateDecimal($value); - $places = self::validatePlaces(Functions::flattenSingleValue($places)); + $places = self::validatePlaces($places); } catch (Exception $e) { return $e->getMessage(); } @@ -69,7 +79,7 @@ class ConvertDecimal extends ConvertBase * Excel Function: * DEC2HEX(x[,places]) * - * @param string $value The decimal integer you want to convert. If number is negative, + * @param array|string $value The decimal integer you want to convert. If number is negative, * places is ignored and DEC2HEX returns a 10-character (40-bit) * hexadecimal number in which the most significant bit is the sign * bit. The remaining 39 bits are magnitude bits. Negative numbers @@ -79,19 +89,29 @@ class ConvertDecimal extends ConvertBase * If number is nonnumeric, DEC2HEX returns the #VALUE! error value. * If DEC2HEX requires more than places characters, it returns the * #NUM! error value. - * @param int $places The number of characters to use. If places is omitted, DEC2HEX uses + * Or can be an array of values + * @param array|int $places The number of characters to use. If places is omitted, DEC2HEX uses * the minimum number of characters necessary. Places is useful for * padding the return value with leading 0s (zeros). * If places is not an integer, it is truncated. * If places is nonnumeric, DEC2HEX returns the #VALUE! error value. * If places is zero or negative, DEC2HEX returns the #NUM! error value. + * Or can be an array of values + * + * @return array|string Result, or an error + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ - public static function toHex($value, $places = null): string + public static function toHex($value, $places = null) { + if (is_array($value) || is_array($places)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $places); + } + try { - $value = self::validateValue(Functions::flattenSingleValue($value)); + $value = self::validateValue($value); $value = self::validateDecimal($value); - $places = self::validatePlaces(Functions::flattenSingleValue($places)); + $places = self::validatePlaces($places); } catch (Exception $e) { return $e->getMessage(); } @@ -135,7 +155,7 @@ class ConvertDecimal extends ConvertBase * Excel Function: * DEC2OCT(x[,places]) * - * @param string $value The decimal integer you want to convert. If number is negative, + * @param array|string $value The decimal integer you want to convert. If number is negative, * places is ignored and DEC2OCT returns a 10-character (30-bit) * octal number in which the most significant bit is the sign bit. * The remaining 29 bits are magnitude bits. Negative numbers are @@ -145,19 +165,29 @@ class ConvertDecimal extends ConvertBase * If number is nonnumeric, DEC2OCT returns the #VALUE! error value. * If DEC2OCT requires more than places characters, it returns the * #NUM! error value. - * @param int $places The number of characters to use. If places is omitted, DEC2OCT uses + * Or can be an array of values + * @param array|int $places The number of characters to use. If places is omitted, DEC2OCT uses * the minimum number of characters necessary. Places is useful for * padding the return value with leading 0s (zeros). * If places is not an integer, it is truncated. * If places is nonnumeric, DEC2OCT returns the #VALUE! error value. * If places is zero or negative, DEC2OCT returns the #NUM! error value. + * Or can be an array of values + * + * @return array|string Result, or an error + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ - public static function toOctal($value, $places = null): string + public static function toOctal($value, $places = null) { + if (is_array($value) || is_array($places)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $places); + } + try { - $value = self::validateValue(Functions::flattenSingleValue($value)); + $value = self::validateValue($value); $value = self::validateDecimal($value); - $places = self::validatePlaces(Functions::flattenSingleValue($places)); + $places = self::validatePlaces($places); } catch (Exception $e) { return $e->getMessage(); } diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/ConvertHex.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/ConvertHex.php index de1b0704f..12c99521b 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/ConvertHex.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/ConvertHex.php @@ -15,7 +15,7 @@ class ConvertHex extends ConvertBase * Excel Function: * HEX2BIN(x[,places]) * - * @param string $value The hexadecimal number you want to convert. + * @param array|string $value The hexadecimal number you want to convert. * Number cannot contain more than 10 characters. * The most significant bit of number is the sign bit (40th bit from the right). * The remaining 9 bits are magnitude bits. @@ -25,19 +25,29 @@ class ConvertHex extends ConvertBase * and if number is positive, it cannot be greater than 1FF. * If number is not a valid hexadecimal number, HEX2BIN returns the #NUM! error value. * If HEX2BIN requires more than places characters, it returns the #NUM! error value. - * @param int $places The number of characters to use. If places is omitted, + * Or can be an array of values + * @param array|int $places The number of characters to use. If places is omitted, * HEX2BIN uses the minimum number of characters necessary. Places * is useful for padding the return value with leading 0s (zeros). * If places is not an integer, it is truncated. * If places is nonnumeric, HEX2BIN returns the #VALUE! error value. * If places is negative, HEX2BIN returns the #NUM! error value. + * Or can be an array of values + * + * @return array|string Result, or an error + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ - public static function toBinary($value, $places = null): string + public static function toBinary($value, $places = null) { + if (is_array($value) || is_array($places)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $places); + } + try { - $value = self::validateValue(Functions::flattenSingleValue($value)); + $value = self::validateValue($value); $value = self::validateHex($value); - $places = self::validatePlaces(Functions::flattenSingleValue($places)); + $places = self::validatePlaces($places); } catch (Exception $e) { return $e->getMessage(); } @@ -55,18 +65,27 @@ class ConvertHex extends ConvertBase * Excel Function: * HEX2DEC(x) * - * @param string $value The hexadecimal number you want to convert. This number cannot + * @param array|string $value The hexadecimal number you want to convert. This number cannot * contain more than 10 characters (40 bits). The most significant * bit of number is the sign bit. The remaining 39 bits are magnitude * bits. Negative numbers are represented using two's-complement * notation. * If number is not a valid hexadecimal number, HEX2DEC returns the * #NUM! error value. + * Or can be an array of values + * + * @return array|string Result, or an error + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ - public static function toDecimal($value): string + public static function toDecimal($value) { + if (is_array($value)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $value); + } + try { - $value = self::validateValue(Functions::flattenSingleValue($value)); + $value = self::validateValue($value); $value = self::validateHex($value); } catch (Exception $e) { return $e->getMessage(); @@ -99,7 +118,7 @@ class ConvertHex extends ConvertBase * Excel Function: * HEX2OCT(x[,places]) * - * @param string $value The hexadecimal number you want to convert. Number cannot + * @param array|string $value The hexadecimal number you want to convert. Number cannot * contain more than 10 characters. The most significant bit of * number is the sign bit. The remaining 39 bits are magnitude * bits. Negative numbers are represented using two's-complement @@ -112,20 +131,30 @@ class ConvertHex extends ConvertBase * the #NUM! error value. * If HEX2OCT requires more than places characters, it returns * the #NUM! error value. - * @param int $places The number of characters to use. If places is omitted, HEX2OCT + * Or can be an array of values + * @param array|int $places The number of characters to use. If places is omitted, HEX2OCT * uses the minimum number of characters necessary. Places is * useful for padding the return value with leading 0s (zeros). * If places is not an integer, it is truncated. * If places is nonnumeric, HEX2OCT returns the #VALUE! error * value. * If places is negative, HEX2OCT returns the #NUM! error value. + * Or can be an array of values + * + * @return array|string Result, or an error + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ - public static function toOctal($value, $places = null): string + public static function toOctal($value, $places = null) { + if (is_array($value) || is_array($places)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $places); + } + try { - $value = self::validateValue(Functions::flattenSingleValue($value)); + $value = self::validateValue($value); $value = self::validateHex($value); - $places = self::validatePlaces(Functions::flattenSingleValue($places)); + $places = self::validatePlaces($places); } catch (Exception $e) { return $e->getMessage(); } diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/ConvertOctal.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/ConvertOctal.php index 1181e2ee1..3c3af5c14 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/ConvertOctal.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/ConvertOctal.php @@ -15,7 +15,7 @@ class ConvertOctal extends ConvertBase * Excel Function: * OCT2BIN(x[,places]) * - * @param string $value The octal number you want to convert. Number may not + * @param array|string $value The octal number you want to convert. Number may not * contain more than 10 characters. The most significant * bit of number is the sign bit. The remaining 29 bits * are magnitude bits. Negative numbers are represented @@ -28,7 +28,8 @@ class ConvertOctal extends ConvertBase * the #NUM! error value. * If OCT2BIN requires more than places characters, it * returns the #NUM! error value. - * @param int $places The number of characters to use. If places is omitted, + * Or can be an array of values + * @param array|int $places The number of characters to use. If places is omitted, * OCT2BIN uses the minimum number of characters necessary. * Places is useful for padding the return value with * leading 0s (zeros). @@ -37,13 +38,22 @@ class ConvertOctal extends ConvertBase * error value. * If places is negative, OCT2BIN returns the #NUM! error * value. + * Or can be an array of values + * + * @return array|string Result, or an error + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ - public static function toBinary($value, $places = null): string + public static function toBinary($value, $places = null) { + if (is_array($value) || is_array($places)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $places); + } + try { - $value = self::validateValue(Functions::flattenSingleValue($value)); + $value = self::validateValue($value); $value = self::validateOctal($value); - $places = self::validatePlaces(Functions::flattenSingleValue($places)); + $places = self::validatePlaces($places); } catch (Exception $e) { return $e->getMessage(); } @@ -59,18 +69,27 @@ class ConvertOctal extends ConvertBase * Excel Function: * OCT2DEC(x) * - * @param string $value The octal number you want to convert. Number may not contain + * @param array|string $value The octal number you want to convert. Number may not contain * more than 10 octal characters (30 bits). The most significant * bit of number is the sign bit. The remaining 29 bits are * magnitude bits. Negative numbers are represented using * two's-complement notation. * If number is not a valid octal number, OCT2DEC returns the * #NUM! error value. + * Or can be an array of values + * + * @return array|string Result, or an error + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ - public static function toDecimal($value): string + public static function toDecimal($value) { + if (is_array($value)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $value); + } + try { - $value = self::validateValue(Functions::flattenSingleValue($value)); + $value = self::validateValue($value); $value = self::validateOctal($value); } catch (Exception $e) { return $e->getMessage(); @@ -99,7 +118,7 @@ class ConvertOctal extends ConvertBase * Excel Function: * OCT2HEX(x[,places]) * - * @param string $value The octal number you want to convert. Number may not contain + * @param array|string $value The octal number you want to convert. Number may not contain * more than 10 octal characters (30 bits). The most significant * bit of number is the sign bit. The remaining 29 bits are * magnitude bits. Negative numbers are represented using @@ -110,25 +129,35 @@ class ConvertOctal extends ConvertBase * #NUM! error value. * If OCT2HEX requires more than places characters, it returns * the #NUM! error value. - * @param int $places The number of characters to use. If places is omitted, OCT2HEX + * Or can be an array of values + * @param array|int $places The number of characters to use. If places is omitted, OCT2HEX * uses the minimum number of characters necessary. Places is useful * for padding the return value with leading 0s (zeros). * If places is not an integer, it is truncated. * If places is nonnumeric, OCT2HEX returns the #VALUE! error value. * If places is negative, OCT2HEX returns the #NUM! error value. + * Or can be an array of values + * + * @return array|string Result, or an error + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ - public static function toHex($value, $places = null): string + public static function toHex($value, $places = null) { + if (is_array($value) || is_array($places)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $places); + } + try { - $value = self::validateValue(Functions::flattenSingleValue($value)); + $value = self::validateValue($value); $value = self::validateOctal($value); - $places = self::validatePlaces(Functions::flattenSingleValue($places)); + $places = self::validatePlaces($places); } catch (Exception $e) { return $e->getMessage(); } $hexVal = strtoupper(dechex((int) self::toDecimal($value))); - $hexVal = (PHP_INT_SIZE === 4 && strlen($value) === 10 && $value[0] >= '4') ? "FF$hexVal" : $hexVal; + $hexVal = (PHP_INT_SIZE === 4 && strlen($value) === 10 && $value[0] >= '4') ? "FF{$hexVal}" : $hexVal; return self::nbrConversionFormat($hexVal, $places); } diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/ConvertUOM.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/ConvertUOM.php index d169ae54b..089ccbd7d 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/ConvertUOM.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/ConvertUOM.php @@ -2,11 +2,14 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\Engineering; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception; use PhpOffice\PhpSpreadsheet\Calculation\Functions; class ConvertUOM { + use ArrayEnabled; + public const CATEGORY_WEIGHT_AND_MASS = 'Weight and Mass'; public const CATEGORY_DISTANCE = 'Distance'; public const CATEGORY_TIME = 'Time'; @@ -518,17 +521,22 @@ class ConvertUOM * Excel Function: * CONVERT(value,fromUOM,toUOM) * - * @param float|int $value the value in fromUOM to convert - * @param string $fromUOM the units for value - * @param string $toUOM the units for the result + * @param array|float|int|string $value the value in fromUOM to convert + * Or can be an array of values + * @param array|string $fromUOM the units for value + * Or can be an array of values + * @param array|string $toUOM the units for the result + * Or can be an array of values * - * @return float|string + * @return array|float|string Result, or a string containing an error + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function CONVERT($value, $fromUOM, $toUOM) { - $value = Functions::flattenSingleValue($value); - $fromUOM = Functions::flattenSingleValue($fromUOM); - $toUOM = Functions::flattenSingleValue($toUOM); + if (is_array($value) || is_array($fromUOM) || is_array($toUOM)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $fromUOM, $toUOM); + } if (!is_numeric($value)) { return Functions::VALUE(); @@ -545,6 +553,7 @@ class ConvertUOM return Functions::NA(); } + // @var float $value $value *= $fromMultiplier; if (($fromUOM === $toUOM) && ($fromMultiplier === $toMultiplier)) { diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/Erf.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/Erf.php index db87ec0d3..5aca8f2bb 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/Erf.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/Erf.php @@ -2,10 +2,13 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\Engineering; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Functions; class Erf { + use ArrayEnabled; + private static $twoSqrtPi = 1.128379167095512574; /** @@ -22,15 +25,20 @@ class Erf * ERF(lower[,upper]) * * @param mixed $lower Lower bound float for integrating ERF + * Or can be an array of values * @param mixed $upper Upper bound float for integrating ERF. * If omitted, ERF integrates between zero and lower_limit + * Or can be an array of values * - * @return float|string + * @return array|float|string + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function ERF($lower, $upper = null) { - $lower = Functions::flattenSingleValue($lower); - $upper = Functions::flattenSingleValue($upper); + if (is_array($lower) || is_array($upper)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $lower, $upper); + } if (is_numeric($lower)) { if ($upper === null) { @@ -53,12 +61,17 @@ class Erf * ERF.PRECISE(limit) * * @param mixed $limit Float bound for integrating ERF, other bound is zero + * Or can be an array of values * - * @return float|string + * @return array|float|string + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function ERFPRECISE($limit) { - $limit = Functions::flattenSingleValue($limit); + if (is_array($limit)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $limit); + } return self::ERF($limit); } diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/ErfC.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/ErfC.php index c57a28f49..da1a932ed 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/ErfC.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/ErfC.php @@ -2,10 +2,13 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\Engineering; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Functions; class ErfC { + use ArrayEnabled; + /** * ERFC. * @@ -20,12 +23,17 @@ class ErfC * ERFC(x) * * @param mixed $value The float lower bound for integrating ERFC + * Or can be an array of values * - * @return float|string + * @return array|float|string + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function ERFC($value) { - $value = Functions::flattenSingleValue($value); + if (is_array($value)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $value); + } if (is_numeric($value)) { return self::erfcValue($value); @@ -45,7 +53,7 @@ class ErfC return 1 - Erf::erfValue($value); } if ($value < 0) { - return 2 - self::ERFC(-$value); + return 2 - self::erfcValue(-$value); } $a = $n = 1; $b = $c = $value; diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial.php index 9d933b4a9..4215a5163 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial.php @@ -587,10 +587,10 @@ class Financial * @see Financial\Dollar::decimal() * Use the decimal() method in the Financial\Dollar class instead * - * @param float $fractional_dollar Fractional Dollar - * @param int $fraction Fraction + * @param array|float $fractional_dollar Fractional Dollar + * @param array|int $fraction Fraction * - * @return float|string + * @return array|float|string */ public static function DOLLARDE($fractional_dollar = null, $fraction = 0) { @@ -612,10 +612,10 @@ class Financial * @see Financial\Dollar::fractional() * Use the fractional() method in the Financial\Dollar class instead * - * @param float $decimal_dollar Decimal Dollar - * @param int $fraction Fraction + * @param array|float $decimal_dollar Decimal Dollar + * @param array|int $fraction Fraction * - * @return float|string + * @return array|float|string */ public static function DOLLARFR($decimal_dollar = null, $fraction = 0) { diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial/Amortization.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial/Amortization.php index ba7fb5210..b16cc23f6 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial/Amortization.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial/Amortization.php @@ -168,7 +168,7 @@ class Amortization if ( ($basis == FinancialConstants::BASIS_DAYS_PER_YEAR_ACTUAL) && - ($yearFrac < 1) && (DateTimeExcel\Helpers::isLeapYear($purchasedYear)) + ($yearFrac < 1) && (Functions::scalar(DateTimeExcel\Helpers::isLeapYear($purchasedYear))) ) { $yearFrac *= 365 / 366; } diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial/CashFlow/Variable/NonPeriodic.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial/CashFlow/Variable/NonPeriodic.php index 8986146c1..d590e1a4e 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial/CashFlow/Variable/NonPeriodic.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial/CashFlow/Variable/NonPeriodic.php @@ -12,6 +12,8 @@ class NonPeriodic const FINANCIAL_PRECISION = 1.0e-08; + const DEFAULT_GUESS = 0.1; + /** * XIRR. * @@ -25,11 +27,11 @@ class NonPeriodic * @param mixed[] $dates A series of payment dates * The first payment date indicates the beginning of the schedule of payments * All other dates must be later than this date, but they may occur in any order - * @param float $guess An optional guess at the expected answer + * @param mixed $guess An optional guess at the expected answer * * @return float|string */ - public static function rate($values, $dates, $guess = 0.1) + public static function rate($values, $dates, $guess = self::DEFAULT_GUESS) { $rslt = self::xirrPart1($values, $dates); if ($rslt !== '') { @@ -37,9 +39,13 @@ class NonPeriodic } // create an initial range, with a root somewhere between 0 and guess - $guess = Functions::flattenSingleValue($guess); + $guess = Functions::flattenSingleValue($guess) ?? self::DEFAULT_GUESS; + if (!is_numeric($guess)) { + return Functions::VALUE(); + } + $guess = ($guess + 0.0) ?: self::DEFAULT_GUESS; $x1 = 0.0; - $x2 = $guess ?: 0.1; + $x2 = $guess + 0.0; $f1 = self::xnpvOrdered($x1, $values, $dates, false); $f2 = self::xnpvOrdered($x2, $values, $dates, false); $found = false; @@ -54,9 +60,11 @@ class NonPeriodic break; } elseif (abs($f1) < abs($f2)) { - $f1 = self::xnpvOrdered($x1 += 1.6 * ($x1 - $x2), $values, $dates, false); + $x1 += 1.6 * ($x1 - $x2); + $f1 = self::xnpvOrdered($x1, $values, $dates, false); } else { - $f2 = self::xnpvOrdered($x2 += 1.6 * ($x2 - $x1), $values, $dates, false); + $x2 += 1.6 * ($x2 - $x1); + $f2 = self::xnpvOrdered($x2, $values, $dates, false); } } if (!$found) { @@ -104,11 +112,13 @@ class NonPeriodic */ private static function xirrPart1(&$values, &$dates): string { - if (!is_array($values) && !is_array($dates)) { - return Functions::NA(); - } $values = Functions::flattenArray($values); $dates = Functions::flattenArray($dates); + $valuesIsArray = count($values) > 1; + $datesIsArray = count($dates) > 1; + if (!$valuesIsArray && !$datesIsArray) { + return Functions::NA(); + } if (count($values) != count($dates)) { return Functions::NAN(); } @@ -219,7 +229,11 @@ class NonPeriodic if (!is_numeric($dif)) { return $dif; } - $xnpv += $values[$i] / (1 + $rate) ** ($dif / 365); + if ($rate <= -1.0) { + $xnpv += -abs($values[$i]) / (-1 - $rate) ** ($dif / 365); + } else { + $xnpv += $values[$i] / (1 + $rate) ** ($dif / 365); + } } return is_finite($xnpv) ? $xnpv : Functions::VALUE(); diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial/Coupons.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial/Coupons.php index 3fd6c1d2d..ad487def8 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial/Coupons.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial/Coupons.php @@ -64,7 +64,7 @@ class Coupons return $e->getMessage(); } - $daysPerYear = Helpers::daysPerYear(DateTimeExcel\DateParts::year($settlement), $basis); + $daysPerYear = Helpers::daysPerYear(Functions::scalar(DateTimeExcel\DateParts::year($settlement)), $basis); if (is_string($daysPerYear)) { return Functions::VALUE(); } @@ -134,7 +134,7 @@ class Coupons case FinancialConstants::BASIS_DAYS_PER_YEAR_ACTUAL: // Actual/actual if ($frequency == FinancialConstants::FREQUENCY_ANNUAL) { - $daysPerYear = Helpers::daysPerYear(DateTimeExcel\DateParts::year($settlement), $basis); + $daysPerYear = (int) Helpers::daysPerYear(Functions::scalar(DateTimeExcel\DateParts::year($settlement)), $basis); return $daysPerYear / $frequency; } diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial/Dollar.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial/Dollar.php index 7bebb3917..0dde0c169 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial/Dollar.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial/Dollar.php @@ -2,23 +2,33 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\Financial; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; +use PhpOffice\PhpSpreadsheet\Calculation\Exception; use PhpOffice\PhpSpreadsheet\Calculation\Functions; use PhpOffice\PhpSpreadsheet\Calculation\TextData\Format; class Dollar { + use ArrayEnabled; + /** * DOLLAR. * * This function converts a number to text using currency format, with the decimals rounded to the specified place. * The format used is $#,##0.00_);($#,##0.00).. * - * @param mixed $number The value to format + * @param mixed $number The value to format, or can be an array of numbers + * Or can be an array of values * @param mixed $precision The number of digits to display to the right of the decimal point (as an integer). * If precision is negative, number is rounded to the left of the decimal point. * If you omit precision, it is assumed to be 2 + * Or can be an array of precision values + * + * @return array|string + * If an array of values is passed for either of the arguments, then the returned result + * will also be an array with matching dimensions */ - public static function format($number, $precision = 2): string + public static function format($number, $precision = 2) { return Format::DOLLAR($number, $precision); } @@ -34,25 +44,37 @@ class Dollar * DOLLARDE(fractional_dollar,fraction) * * @param mixed $fractionalDollar Fractional Dollar + * Or can be an array of values * @param mixed $fraction Fraction + * Or can be an array of values * - * @return float|string + * @return array|float|string */ public static function decimal($fractionalDollar = null, $fraction = 0) { - $fractionalDollar = Functions::flattenSingleValue($fractionalDollar); - $fraction = (int) Functions::flattenSingleValue($fraction); + if (is_array($fractionalDollar) || is_array($fraction)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $fractionalDollar, $fraction); + } - // Validate parameters - if ($fractionalDollar === null || $fraction < 0) { + try { + $fractionalDollar = FinancialValidations::validateFloat( + Functions::flattenSingleValue($fractionalDollar) ?? 0.0 + ); + $fraction = FinancialValidations::validateInt(Functions::flattenSingleValue($fraction)); + } catch (Exception $e) { + return $e->getMessage(); + } + + // Additional parameter validations + if ($fraction < 0) { return Functions::NAN(); } if ($fraction == 0) { return Functions::DIV0(); } - $dollars = floor($fractionalDollar); - $cents = fmod($fractionalDollar, 1); + $dollars = ($fractionalDollar < 0) ? ceil($fractionalDollar) : floor($fractionalDollar); + $cents = fmod($fractionalDollar, 1.0); $cents /= $fraction; $cents *= 10 ** ceil(log10($fraction)); @@ -70,24 +92,36 @@ class Dollar * DOLLARFR(decimal_dollar,fraction) * * @param mixed $decimalDollar Decimal Dollar + * Or can be an array of values * @param mixed $fraction Fraction + * Or can be an array of values * - * @return float|string + * @return array|float|string */ public static function fractional($decimalDollar = null, $fraction = 0) { - $decimalDollar = Functions::flattenSingleValue($decimalDollar); - $fraction = (int) Functions::flattenSingleValue($fraction); + if (is_array($decimalDollar) || is_array($fraction)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $decimalDollar, $fraction); + } - // Validate parameters - if ($decimalDollar === null || $fraction < 0) { + try { + $decimalDollar = FinancialValidations::validateFloat( + Functions::flattenSingleValue($decimalDollar) ?? 0.0 + ); + $fraction = FinancialValidations::validateInt(Functions::flattenSingleValue($fraction)); + } catch (Exception $e) { + return $e->getMessage(); + } + + // Additional parameter validations + if ($fraction < 0) { return Functions::NAN(); } if ($fraction == 0) { return Functions::DIV0(); } - $dollars = floor($decimalDollar); + $dollars = ($decimalDollar < 0.0) ? ceil($decimalDollar) : floor($decimalDollar); $cents = fmod($decimalDollar, 1); $cents *= $fraction; $cents *= 10 ** (-ceil(log10($fraction))); diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial/Securities/AccruedInterest.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial/Securities/AccruedInterest.php index e167429b7..95996b4e9 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial/Securities/AccruedInterest.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial/Securities/AccruedInterest.php @@ -78,12 +78,12 @@ class AccruedInterest return $e->getMessage(); } - $daysBetweenIssueAndSettlement = YearFrac::fraction($issue, $settlement, $basis); + $daysBetweenIssueAndSettlement = Functions::scalar(YearFrac::fraction($issue, $settlement, $basis)); if (!is_numeric($daysBetweenIssueAndSettlement)) { // return date error return $daysBetweenIssueAndSettlement; } - $daysBetweenFirstInterestAndSettlement = YearFrac::fraction($firstInterest, $settlement, $basis); + $daysBetweenFirstInterestAndSettlement = Functions::scalar(YearFrac::fraction($firstInterest, $settlement, $basis)); if (!is_numeric($daysBetweenFirstInterestAndSettlement)) { // return date error return $daysBetweenFirstInterestAndSettlement; @@ -140,7 +140,7 @@ class AccruedInterest return $e->getMessage(); } - $daysBetweenIssueAndSettlement = YearFrac::fraction($issue, $settlement, $basis); + $daysBetweenIssueAndSettlement = Functions::scalar(YearFrac::fraction($issue, $settlement, $basis)); if (!is_numeric($daysBetweenIssueAndSettlement)) { // return date error return $daysBetweenIssueAndSettlement; diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial/Securities/Price.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial/Securities/Price.php index 7d8d5a321..cb8937072 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial/Securities/Price.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial/Securities/Price.php @@ -134,7 +134,7 @@ class Price return $e->getMessage(); } - $daysBetweenSettlementAndMaturity = DateTimeExcel\YearFrac::fraction($settlement, $maturity, $basis); + $daysBetweenSettlementAndMaturity = Functions::scalar(DateTimeExcel\YearFrac::fraction($settlement, $maturity, $basis)); if (!is_numeric($daysBetweenSettlementAndMaturity)) { // return date error return $daysBetweenSettlementAndMaturity; @@ -194,23 +194,23 @@ class Price return $e->getMessage(); } - $daysPerYear = Helpers::daysPerYear(DateTimeExcel\DateParts::year($settlement), $basis); + $daysPerYear = Functions::scalar(Helpers::daysPerYear(DateTimeExcel\DateParts::year($settlement), $basis)); if (!is_numeric($daysPerYear)) { return $daysPerYear; } - $daysBetweenIssueAndSettlement = DateTimeExcel\YearFrac::fraction($issue, $settlement, $basis); + $daysBetweenIssueAndSettlement = Functions::scalar(DateTimeExcel\YearFrac::fraction($issue, $settlement, $basis)); if (!is_numeric($daysBetweenIssueAndSettlement)) { // return date error return $daysBetweenIssueAndSettlement; } $daysBetweenIssueAndSettlement *= $daysPerYear; - $daysBetweenIssueAndMaturity = DateTimeExcel\YearFrac::fraction($issue, $maturity, $basis); + $daysBetweenIssueAndMaturity = Functions::scalar(DateTimeExcel\YearFrac::fraction($issue, $maturity, $basis)); if (!is_numeric($daysBetweenIssueAndMaturity)) { // return date error return $daysBetweenIssueAndMaturity; } $daysBetweenIssueAndMaturity *= $daysPerYear; - $daysBetweenSettlementAndMaturity = DateTimeExcel\YearFrac::fraction($settlement, $maturity, $basis); + $daysBetweenSettlementAndMaturity = Functions::scalar(DateTimeExcel\YearFrac::fraction($settlement, $maturity, $basis)); if (!is_numeric($daysBetweenSettlementAndMaturity)) { // return date error return $daysBetweenSettlementAndMaturity; diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial/Securities/Rates.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial/Securities/Rates.php index c5c5211b7..84218a960 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial/Securities/Rates.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial/Securities/Rates.php @@ -63,7 +63,7 @@ class Rates return Functions::NAN(); } - $daysBetweenSettlementAndMaturity = DateTimeExcel\YearFrac::fraction($settlement, $maturity, $basis); + $daysBetweenSettlementAndMaturity = Functions::scalar(DateTimeExcel\YearFrac::fraction($settlement, $maturity, $basis)); if (!is_numeric($daysBetweenSettlementAndMaturity)) { // return date error return $daysBetweenSettlementAndMaturity; @@ -126,7 +126,7 @@ class Rates return Functions::NAN(); } - $daysBetweenSettlementAndMaturity = DateTimeExcel\YearFrac::fraction($settlement, $maturity, $basis); + $daysBetweenSettlementAndMaturity = Functions::scalar(DateTimeExcel\YearFrac::fraction($settlement, $maturity, $basis)); if (!is_numeric($daysBetweenSettlementAndMaturity)) { // return date error return $daysBetweenSettlementAndMaturity; diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial/Securities/Yields.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial/Securities/Yields.php index aa6269354..bb2e8ae22 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial/Securities/Yields.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial/Securities/Yields.php @@ -61,7 +61,7 @@ class Yields if (!is_numeric($daysPerYear)) { return $daysPerYear; } - $daysBetweenSettlementAndMaturity = DateTimeExcel\YearFrac::fraction($settlement, $maturity, $basis); + $daysBetweenSettlementAndMaturity = Functions::scalar(DateTimeExcel\YearFrac::fraction($settlement, $maturity, $basis)); if (!is_numeric($daysBetweenSettlementAndMaturity)) { // return date error return $daysBetweenSettlementAndMaturity; @@ -126,19 +126,19 @@ class Yields if (!is_numeric($daysPerYear)) { return $daysPerYear; } - $daysBetweenIssueAndSettlement = DateTimeExcel\YearFrac::fraction($issue, $settlement, $basis); + $daysBetweenIssueAndSettlement = Functions::scalar(DateTimeExcel\YearFrac::fraction($issue, $settlement, $basis)); if (!is_numeric($daysBetweenIssueAndSettlement)) { // return date error return $daysBetweenIssueAndSettlement; } $daysBetweenIssueAndSettlement *= $daysPerYear; - $daysBetweenIssueAndMaturity = DateTimeExcel\YearFrac::fraction($issue, $maturity, $basis); + $daysBetweenIssueAndMaturity = Functions::scalar(DateTimeExcel\YearFrac::fraction($issue, $maturity, $basis)); if (!is_numeric($daysBetweenIssueAndMaturity)) { // return date error return $daysBetweenIssueAndMaturity; } $daysBetweenIssueAndMaturity *= $daysPerYear; - $daysBetweenSettlementAndMaturity = DateTimeExcel\YearFrac::fraction($settlement, $maturity, $basis); + $daysBetweenSettlementAndMaturity = Functions::scalar(DateTimeExcel\YearFrac::fraction($settlement, $maturity, $basis)); if (!is_numeric($daysBetweenSettlementAndMaturity)) { // return date error return $daysBetweenSettlementAndMaturity; diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial/TreasuryBill.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial/TreasuryBill.php index c60af0b0d..b2c84627f 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial/TreasuryBill.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial/TreasuryBill.php @@ -43,7 +43,7 @@ class TreasuryBill $daysBetweenSettlementAndMaturity = $maturity - $settlement; $daysPerYear = Helpers::daysPerYear( - DateTimeExcel\DateParts::year($maturity), + Functions::scalar(DateTimeExcel\DateParts::year($maturity)), FinancialConstants::BASIS_DAYS_PER_YEAR_ACTUAL ); @@ -88,7 +88,7 @@ class TreasuryBill $daysBetweenSettlementAndMaturity = $maturity - $settlement; $daysPerYear = Helpers::daysPerYear( - DateTimeExcel\DateParts::year($maturity), + Functions::scalar(DateTimeExcel\DateParts::year($maturity)), FinancialConstants::BASIS_DAYS_PER_YEAR_ACTUAL ); @@ -134,7 +134,7 @@ class TreasuryBill $daysBetweenSettlementAndMaturity = $maturity - $settlement; $daysPerYear = Helpers::daysPerYear( - DateTimeExcel\DateParts::year($maturity), + Functions::scalar(DateTimeExcel\DateParts::year($maturity)), FinancialConstants::BASIS_DAYS_PER_YEAR_ACTUAL ); diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Functions.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Functions.php index 75d4582b2..0ccf72e9d 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Functions.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Functions.php @@ -608,6 +608,24 @@ class Functions return $arrayValues; } + /** + * @param mixed $value + * + * @return null|mixed + */ + public static function scalar($value) + { + if (!is_array($value)) { + return $value; + } + + do { + $value = array_pop($value); + } while (is_array($value)); + + return $value; + } + /** * Convert a multi-dimensional array to a simple 1-dimensional array, but retain an element of indexing. * diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Logical.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Logical.php index b267e1f0b..d5d993ae3 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Logical.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Logical.php @@ -163,7 +163,7 @@ class Logical * * @param mixed $logical A value or expression that can be evaluated to TRUE or FALSE * - * @return bool|string the boolean inverse of the argument + * @return array|bool|string the boolean inverse of the argument */ public static function NOT($logical = false) { diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Logical/Conditional.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Logical/Conditional.php index e84d0f33e..12d5b8553 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Logical/Conditional.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Logical/Conditional.php @@ -2,11 +2,14 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\Logical; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception; use PhpOffice\PhpSpreadsheet\Calculation\Functions; class Conditional { + use ArrayEnabled; + /** * STATEMENT_IF. * @@ -34,7 +37,9 @@ class Conditional * * @param mixed $condition Condition to evaluate * @param mixed $returnIfTrue Value to return when condition is true + * Note that this can be an array value * @param mixed $returnIfFalse Optional value to return when condition is false + * Note that this can be an array value * * @return mixed The value of returnIfTrue or returnIfFalse determined by condition */ @@ -45,8 +50,8 @@ class Conditional } $condition = ($condition === null) ? true : (bool) Functions::flattenSingleValue($condition); - $returnIfTrue = ($returnIfTrue === null) ? 0 : Functions::flattenSingleValue($returnIfTrue); - $returnIfFalse = ($returnIfFalse === null) ? false : Functions::flattenSingleValue($returnIfFalse); + $returnIfTrue = $returnIfTrue ?? 0; + $returnIfFalse = $returnIfFalse ?? false; return ($condition) ? $returnIfTrue : $returnIfFalse; } @@ -67,9 +72,11 @@ class Conditional * result1, result2, ... result_n * A list of results. The SWITCH function returns the corresponding result when a value * matches expression. + * Note that these can be array values to be returned * default * Optional. It is the default to return if expression does not match any of the values * (value1, value2, ... value_n). + * Note that this can be an array value to be returned * * @param mixed $arguments Statement arguments * @@ -113,14 +120,21 @@ class Conditional * =IFERROR(testValue,errorpart) * * @param mixed $testValue Value to check, is also the value returned when no error + * Or can be an array of values * @param mixed $errorpart Value to return when testValue is an error condition + * Note that this can be an array value to be returned * * @return mixed The value of errorpart or testValue determined by error condition + * If an array of values is passed as the $testValue argument, then the returned result will also be + * an array with the same dimensions */ public static function IFERROR($testValue = '', $errorpart = '') { - $testValue = ($testValue === null) ? '' : Functions::flattenSingleValue($testValue); - $errorpart = ($errorpart === null) ? '' : Functions::flattenSingleValue($errorpart); + if (is_array($testValue)) { + return self::evaluateArrayArgumentsSubset([self::class, __FUNCTION__], 1, $testValue, $errorpart); + } + + $errorpart = $errorpart ?? ''; return self::statementIf(Functions::isError($testValue), $errorpart, $testValue); } @@ -132,14 +146,21 @@ class Conditional * =IFNA(testValue,napart) * * @param mixed $testValue Value to check, is also the value returned when not an NA + * Or can be an array of values * @param mixed $napart Value to return when testValue is an NA condition + * Note that this can be an array value to be returned * * @return mixed The value of errorpart or testValue determined by error condition + * If an array of values is passed as the $testValue argument, then the returned result will also be + * an array with the same dimensions */ public static function IFNA($testValue = '', $napart = '') { - $testValue = ($testValue === null) ? '' : Functions::flattenSingleValue($testValue); - $napart = ($napart === null) ? '' : Functions::flattenSingleValue($napart); + if (is_array($testValue)) { + return self::evaluateArrayArgumentsSubset([self::class, __FUNCTION__], 1, $testValue, $napart); + } + + $napart = $napart ?? ''; return self::statementIf(Functions::isNa($testValue), $napart, $testValue); } @@ -156,6 +177,7 @@ class Conditional * Value returned if corresponding testValue (nth) was true * * @param mixed ...$arguments Statement arguments + * Note that this can be an array value to be returned * * @return mixed|string The value of returnIfTrue_n, if testValue_n was true. #N/A if none of testValues was true */ @@ -170,7 +192,7 @@ class Conditional $falseValueException = new Exception(); for ($i = 0; $i < $argumentCount; $i += 2) { $testValue = ($arguments[$i] === null) ? '' : Functions::flattenSingleValue($arguments[$i]); - $returnIfTrue = ($arguments[$i + 1] === null) ? '' : Functions::flattenSingleValue($arguments[$i + 1]); + $returnIfTrue = ($arguments[$i + 1] === null) ? '' : $arguments[$i + 1]; $result = self::statementIf($testValue, $returnIfTrue, $falseValueException); if ($result !== $falseValueException) { diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Logical/Operations.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Logical/Operations.php index 6bfb6a545..7c8398596 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Logical/Operations.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Logical/Operations.php @@ -2,11 +2,14 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\Logical; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Calculation; use PhpOffice\PhpSpreadsheet\Calculation\Functions; class Operations { + use ArrayEnabled; + /** * LOGICAL_AND. * @@ -146,12 +149,17 @@ class Operations * holds the value TRUE or FALSE, in which case it is evaluated as the corresponding boolean value * * @param mixed $logical A value or expression that can be evaluated to TRUE or FALSE + * Or can be an array of values * - * @return bool|string the boolean inverse of the argument + * @return array|bool|string the boolean inverse of the argument + * If an array of values is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function NOT($logical = false) { - $logical = Functions::flattenSingleValue($logical); + if (is_array($logical)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $logical); + } if (is_string($logical)) { $logical = mb_strtoupper($logical, 'UTF-8'); diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig.php index ec251f6d2..993154c33 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig.php @@ -20,9 +20,9 @@ class MathTrig * @See MathTrig\Arabic::evaluate() * Use the evaluate method in the MathTrig\Arabic class instead * - * @param string $roman + * @param array|string $roman * - * @return int|string the arabic numberal contrived from the roman numeral + * @return array|int|string the arabic numberal contrived from the roman numeral */ public static function ARABIC($roman) { @@ -50,10 +50,10 @@ class MathTrig * @See MathTrig\Trig\Tangent::atan2() * Use the atan2 method in the MathTrig\Trig\Tangent class instead * - * @param float $xCoordinate the x-coordinate of the point - * @param float $yCoordinate the y-coordinate of the point + * @param array|float $xCoordinate the x-coordinate of the point + * @param array|float $yCoordinate the y-coordinate of the point * - * @return float|string the inverse tangent of the specified x- and y-coordinates, or a string containing an error + * @return array|float|string the inverse tangent of the specified x- and y-coordinates, or a string containing an error */ public static function ATAN2($xCoordinate = null, $yCoordinate = null) { @@ -77,7 +77,7 @@ class MathTrig * @param float $radix * @param int $minLength * - * @return string the text representation with the given radix (base) + * @return array|string the text representation with the given radix (base) */ public static function BASE($number, $radix, $minLength = null) { @@ -100,7 +100,7 @@ class MathTrig * @param float $number the number you want to round * @param float $significance the multiple to which you want to round * - * @return float|string Rounded Number, or a string containing an error + * @return array|float|string Rounded Number, or a string containing an error * * @see MathTrig\Ceiling::ceiling() * Use the ceiling() method in the MathTrig\Ceiling class instead @@ -124,10 +124,10 @@ class MathTrig * @see MathTrig\Combinations::withoutRepetition() * Use the withoutRepetition() method in the MathTrig\Combinations class instead * - * @param int $numObjs Number of different objects - * @param int $numInSet Number of objects in each combination + * @param array|int $numObjs Number of different objects + * @param array|int $numInSet Number of objects in each combination * - * @return float|int|string Number of combinations, or a string containing an error + * @return array|float|int|string Number of combinations, or a string containing an error */ public static function COMBIN($numObjs, $numInSet) { @@ -151,9 +151,9 @@ class MathTrig * @see MathTrig\Round::even() * Use the even() method in the MathTrig\Round class instead * - * @param float $number Number to round + * @param array|float $number Number to round * - * @return float|int|string Rounded Number, or a string containing an error + * @return array|float|int|string Rounded Number, or a string containing an error */ public static function EVEN($number) { @@ -184,9 +184,9 @@ class MathTrig * * @Deprecated 1.18.0 * - * @param float $factVal Factorial Value + * @param array|float $factVal Factorial Value * - * @return float|int|string Factorial, or a string containing an error + * @return array|float|int|string Factorial, or a string containing an error * *@see MathTrig\Factorial::fact() * Use the fact() method in the MathTrig\Factorial class instead @@ -206,9 +206,9 @@ class MathTrig * * @Deprecated 1.18.0 * - * @param float $factVal Factorial Value + * @param array|float $factVal Factorial Value * - * @return float|int|string Double Factorial, or a string containing an error + * @return array|float|int|string Double Factorial, or a string containing an error * *@see MathTrig\Factorial::factDouble() * Use the factDouble() method in the MathTrig\Factorial class instead @@ -231,7 +231,7 @@ class MathTrig * @param float $number Number to round * @param float $significance Significance * - * @return float|string Rounded Number, or a string containing an error + * @return array|float|string Rounded Number, or a string containing an error * *@see MathTrig\Floor::floor() * Use the floor() method in the MathTrig\Floor class instead @@ -255,7 +255,7 @@ class MathTrig * @param float $significance Significance * @param int $mode direction to round negative numbers * - * @return float|string Rounded Number, or a string containing an error + * @return array|float|string Rounded Number, or a string containing an error * *@see MathTrig\Floor::math() * Use the math() method in the MathTrig\Floor class instead @@ -278,7 +278,7 @@ class MathTrig * @param float $number Number to round * @param float $significance Significance * - * @return float|string Rounded Number, or a string containing an error + * @return array|float|string Rounded Number, or a string containing an error * *@see MathTrig\Floor::precise() * Use the precise() method in the MathTrig\Floor class instead @@ -301,9 +301,9 @@ class MathTrig * @see MathTrig\IntClass::evaluate() * Use the evaluate() method in the MathTrig\IntClass class instead * - * @param float $number Number to cast to an integer + * @param array|float $number Number to cast to an integer * - * @return int|string Integer value, or a string containing an error + * @return array|int|string Integer value, or a string containing an error */ public static function INT($number) { @@ -375,7 +375,7 @@ class MathTrig * @param float $number The positive real number for which you want the logarithm * @param float $base The base of the logarithm. If base is omitted, it is assumed to be 10. * - * @return float|string The result, or a string containing an error + * @return array|float|string The result, or a string containing an error */ public static function logBase($number, $base = 10) { @@ -455,7 +455,7 @@ class MathTrig * @param int $a Dividend * @param int $b Divisor * - * @return float|int|string Remainder, or a string containing an error + * @return array|float|int|string Remainder, or a string containing an error */ public static function MOD($a = 1, $b = 1) { @@ -470,9 +470,9 @@ class MathTrig * @Deprecated 1.17.0 * * @param float $number Number to round - * @param int $multiple Multiple to which you want to round $number + * @param array|int $multiple Multiple to which you want to round $number * - * @return float|string Rounded Number, or a string containing an error + * @return array|float|string Rounded Number, or a string containing an error * *@see MathTrig\Round::multiple() * Use the multiple() method in the MathTrig\Mround class instead @@ -511,9 +511,9 @@ class MathTrig * @See MathTrig\Round::odd() * Use the odd method in the MathTrig\Round class instead * - * @param float $number Number to round + * @param array|float $number Number to round * - * @return float|int|string Rounded Number, or a string containing an error + * @return array|float|int|string Rounded Number, or a string containing an error */ public static function ODD($number) { @@ -533,7 +533,7 @@ class MathTrig * @param float $x * @param float $y * - * @return float|int|string The result, or a string containing an error + * @return array|float|int|string The result, or a string containing an error */ public static function POWER($x = 0, $y = 2) { @@ -579,7 +579,7 @@ class MathTrig * @param mixed $numerator * @param mixed $denominator * - * @return int|string + * @return array|int|string */ public static function QUOTIENT($numerator, $denominator) { @@ -597,7 +597,7 @@ class MathTrig * @param int $min Minimal value * @param int $max Maximal value * - * @return float|int|string Random number + * @return array|float|int|string Random number */ public static function RAND($min = 0, $max = 0) { @@ -617,7 +617,7 @@ class MathTrig * @param mixed $aValue Number to convert * @param mixed $style Number indicating one of five possible forms * - * @return string Roman numeral, or a string containing an error + * @return array|string Roman numeral, or a string containing an error */ public static function ROMAN($aValue, $style = 0) { @@ -634,10 +634,10 @@ class MathTrig * @See MathTrig\Round::up() * Use the up() method in the MathTrig\Round class instead * - * @param float $number Number to round - * @param int $digits Number of digits to which you want to round $number + * @param array|float $number Number to round + * @param array|int $digits Number of digits to which you want to round $number * - * @return float|string Rounded Number, or a string containing an error + * @return array|float|string Rounded Number, or a string containing an error */ public static function ROUNDUP($number, $digits) { @@ -654,10 +654,10 @@ class MathTrig * @See MathTrig\Round::down() * Use the down() method in the MathTrig\Round class instead * - * @param float $number Number to round - * @param int $digits Number of digits to which you want to round $number + * @param array|float $number Number to round + * @param array|int $digits Number of digits to which you want to round $number * - * @return float|string Rounded Number, or a string containing an error + * @return array|float|string Rounded Number, or a string containing an error */ public static function ROUNDDOWN($number, $digits) { @@ -679,7 +679,7 @@ class MathTrig * @param mixed $m Step * @param mixed[] $args An array of coefficients for the Data Series * - * @return float|string The result, or a string containing an error + * @return array|float|string The result, or a string containing an error */ public static function SERIESSUM($x, $n, $m, ...$args) { @@ -697,9 +697,9 @@ class MathTrig * @See MathTrig\Sign::evaluate() * Use the evaluate method in the MathTrig\Sign class instead * - * @param float $number Number to round + * @param array|float $number Number to round * - * @return int|string sign value, or a string containing an error + * @return array|int|string sign value, or a string containing an error */ public static function SIGN($number) { @@ -729,9 +729,9 @@ class MathTrig * @See MathTrig\Sqrt::sqrt() * Use the pi method in the MathTrig\Sqrt class instead * - * @param float $number Number + * @param array|float $number Number * - * @return float|string Square Root of Number * Pi, or a string containing an error + * @return array|float|string Square Root of Number * Pi, or a string containing an error */ public static function SQRTPI($number) { @@ -941,7 +941,7 @@ class MathTrig * @param float $value * @param int $digits * - * @return float|string Truncated value, or a string containing an error + * @return array|float|string Truncated value, or a string containing an error */ public static function TRUNC($value = 0, $digits = 0) { @@ -958,9 +958,9 @@ class MathTrig * @See MathTrig\Trig\Secant::sec() * Use the sec method in the MathTrig\Trig\Secant class instead * - * @param float $angle Number + * @param array|float $angle Number * - * @return float|string The secant of the angle + * @return array|float|string The secant of the angle */ public static function SEC($angle) { @@ -977,9 +977,9 @@ class MathTrig * @See MathTrig\Trig\Secant::sech() * Use the sech method in the MathTrig\Trig\Secant class instead * - * @param float $angle Number + * @param array|float $angle Number * - * @return float|string The hyperbolic secant of the angle + * @return array|float|string The hyperbolic secant of the angle */ public static function SECH($angle) { @@ -996,9 +996,9 @@ class MathTrig * @See MathTrig\Trig\Cosecant::csc() * Use the csc method in the MathTrig\Trig\Cosecant class instead * - * @param float $angle Number + * @param array|float $angle Number * - * @return float|string The cosecant of the angle + * @return array|float|string The cosecant of the angle */ public static function CSC($angle) { @@ -1015,9 +1015,9 @@ class MathTrig * @See MathTrig\Trig\Cosecant::csch() * Use the csch method in the MathTrig\Trig\Cosecant class instead * - * @param float $angle Number + * @param array|float $angle Number * - * @return float|string The hyperbolic cosecant of the angle + * @return array|float|string The hyperbolic cosecant of the angle */ public static function CSCH($angle) { @@ -1034,9 +1034,9 @@ class MathTrig * @See MathTrig\Trig\Cotangent::cot() * Use the cot method in the MathTrig\Trig\Cotangent class instead * - * @param float $angle Number + * @param array|float $angle Number * - * @return float|string The cotangent of the angle + * @return array|float|string The cotangent of the angle */ public static function COT($angle) { @@ -1053,9 +1053,9 @@ class MathTrig * @See MathTrig\Trig\Cotangent::coth() * Use the coth method in the MathTrig\Trig\Cotangent class instead * - * @param float $angle Number + * @param array|float $angle Number * - * @return float|string The hyperbolic cotangent of the angle + * @return array|float|string The hyperbolic cotangent of the angle */ public static function COTH($angle) { @@ -1072,9 +1072,9 @@ class MathTrig * @See MathTrig\Trig\Cotangent::acot() * Use the acot method in the MathTrig\Trig\Cotangent class instead * - * @param float $number Number + * @param array|float $number Number * - * @return float|string The arccotangent of the number + * @return array|float|string The arccotangent of the number */ public static function ACOT($number) { @@ -1108,9 +1108,9 @@ class MathTrig * @See MathTrig\Trig\Cotangent::acoth() * Use the acoth method in the MathTrig\Trig\Cotangent class instead * - * @param float $number Number + * @param array|float $number Number * - * @return float|string The hyperbolic arccotangent of the number + * @return array|float|string The hyperbolic arccotangent of the number */ public static function ACOTH($number) { @@ -1127,10 +1127,10 @@ class MathTrig * @See MathTrig\Round::round() * Use the round() method in the MathTrig\Round class instead * - * @param mixed $number Should be numeric - * @param mixed $precision Should be int + * @param array|mixed $number Should be numeric + * @param array|mixed $precision Should be int * - * @return float|string Rounded number + * @return array|float|string Rounded number */ public static function builtinROUND($number, $precision) { @@ -1147,9 +1147,9 @@ class MathTrig * @See MathTrig\Absolute::evaluate() * Use the evaluate method in the MathTrig\Absolute class instead * - * @param mixed $number Should be numeric + * @param array|mixed $number Should be numeric * - * @return float|int|string Rounded number + * @return array|float|int|string Rounded number */ public static function builtinABS($number) { @@ -1166,9 +1166,9 @@ class MathTrig * * Returns the result of builtin function acos after validating args. * - * @param mixed $number Should be numeric + * @param array|float $number Should be numeric * - * @return float|string Rounded number + * @return array|float|string Rounded number */ public static function builtinACOS($number) { @@ -1185,9 +1185,9 @@ class MathTrig * @See MathTrig\Trig\Cosine::acosh() * Use the acosh method in the MathTrig\Trig\Cosine class instead * - * @param mixed $number Should be numeric + * @param array|float $number Should be numeric * - * @return float|string Rounded number + * @return array|float|string Rounded number */ public static function builtinACOSH($number) { @@ -1204,9 +1204,9 @@ class MathTrig * @See MathTrig\Trig\Sine::asin() * Use the asin method in the MathTrig\Trig\Sine class instead * - * @param mixed $number Should be numeric + * @param array|float $number Should be numeric * - * @return float|string Rounded number + * @return array|float|string Rounded number */ public static function builtinASIN($number) { @@ -1223,9 +1223,9 @@ class MathTrig * @See MathTrig\Trig\Sine::asinh() * Use the asinh method in the MathTrig\Trig\Sine class instead * - * @param mixed $number Should be numeric + * @param array|float $number Should be numeric * - * @return float|string Rounded number + * @return array|float|string Rounded number */ public static function builtinASINH($number) { @@ -1242,9 +1242,9 @@ class MathTrig * @See MathTrig\Trig\Tangent::atan() * Use the atan method in the MathTrig\Trig\Tangent class instead * - * @param mixed $number Should be numeric + * @param array|float $number Should be numeric * - * @return float|string Rounded number + * @return array|float|string Rounded number */ public static function builtinATAN($number) { @@ -1261,9 +1261,9 @@ class MathTrig * @See MathTrig\Trig\Tangent::atanh() * Use the atanh method in the MathTrig\Trig\Tangent class instead * - * @param mixed $number Should be numeric + * @param array|float $number Should be numeric * - * @return float|string Rounded number + * @return array|float|string Rounded number */ public static function builtinATANH($number) { @@ -1280,9 +1280,9 @@ class MathTrig * @See MathTrig\Trig\Cosine::cos() * Use the cos method in the MathTrig\Trig\Cosine class instead * - * @param mixed $number Should be numeric + * @param array|mixed $number Should be numeric * - * @return float|string Rounded number + * @return array|float|string Rounded number */ public static function builtinCOS($number) { @@ -1299,9 +1299,9 @@ class MathTrig * @See MathTrig\Trig\Cosine::cosh() * Use the cosh method in the MathTrig\Trig\Cosine class instead * - * @param mixed $number Should be numeric + * @param array|mixed $number Should be numeric * - * @return float|string Rounded number + * @return array|float|string Rounded number */ public static function builtinCOSH($number) { @@ -1318,9 +1318,9 @@ class MathTrig * @See MathTrig\Angle::toDegrees() * Use the toDegrees method in the MathTrig\Angle class instead * - * @param mixed $number Should be numeric + * @param array|mixed $number Should be numeric * - * @return float|string Rounded number + * @return array|float|string Rounded number */ public static function builtinDEGREES($number) { @@ -1337,9 +1337,9 @@ class MathTrig * @See MathTrig\Exp::evaluate() * Use the evaluate method in the MathTrig\Exp class instead * - * @param mixed $number Should be numeric + * @param array|mixed $number Should be numeric * - * @return float|string Rounded number + * @return array|float|string Rounded number */ public static function builtinEXP($number) { @@ -1358,7 +1358,7 @@ class MathTrig * * @param mixed $number Should be numeric * - * @return float|string Rounded number + * @return array|float|string Rounded number */ public static function builtinLN($number) { @@ -1377,7 +1377,7 @@ class MathTrig * * @param mixed $number Should be numeric * - * @return float|string Rounded number + * @return array|float|string Rounded number */ public static function builtinLOG10($number) { @@ -1394,9 +1394,9 @@ class MathTrig * @See MathTrig\Angle::toRadians() * Use the toRadians method in the MathTrig\Angle class instead * - * @param mixed $number Should be numeric + * @param array|mixed $number Should be numeric * - * @return float|string Rounded number + * @return array|float|string Rounded number */ public static function builtinRADIANS($number) { @@ -1413,9 +1413,9 @@ class MathTrig * @See MathTrig\Trig\Sine::evaluate() * Use the sin method in the MathTrig\Trig\Sine class instead * - * @param mixed $number Should be numeric + * @param array|mixed $number Should be numeric * - * @return float|string sine + * @return array|float|string sine */ public static function builtinSIN($number) { @@ -1432,9 +1432,9 @@ class MathTrig * @See MathTrig\Trig\Sine::sinh() * Use the sinh method in the MathTrig\Trig\Sine class instead * - * @param mixed $number Should be numeric + * @param array|mixed $number Should be numeric * - * @return float|string Rounded number + * @return array|float|string Rounded number */ public static function builtinSINH($number) { @@ -1451,9 +1451,9 @@ class MathTrig * @See MathTrig\Sqrt::sqrt() * Use the sqrt method in the MathTrig\Sqrt class instead * - * @param mixed $number Should be numeric + * @param array|mixed $number Should be numeric * - * @return float|string Rounded number + * @return array|float|string Rounded number */ public static function builtinSQRT($number) { @@ -1470,9 +1470,9 @@ class MathTrig * @See MathTrig\Trig\Tangent::tan() * Use the tan method in the MathTrig\Trig\Tangent class instead * - * @param mixed $number Should be numeric + * @param array|mixed $number Should be numeric * - * @return float|string Rounded number + * @return array|float|string Rounded number */ public static function builtinTAN($number) { @@ -1489,9 +1489,9 @@ class MathTrig * @See MathTrig\Trig\Tangent::tanh() * Use the tanh method in the MathTrig\Trig\Tangent class instead * - * @param mixed $number Should be numeric + * @param array|mixed $number Should be numeric * - * @return float|string Rounded number + * @return array|float|string Rounded number */ public static function builtinTANH($number) { diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Absolute.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Absolute.php index 9f1bd8049..f21c6b73c 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Absolute.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Absolute.php @@ -2,21 +2,30 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\MathTrig; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception; class Absolute { + use ArrayEnabled; + /** * ABS. * * Returns the result of builtin function abs after validating args. * - * @param mixed $number Should be numeric + * @param mixed $number Should be numeric, or can be an array of numbers * - * @return float|int|string Rounded number + * @return array|float|int|string rounded number + * If an array of numbers is passed as the argument, then the returned result will also be an array + * with the same dimensions */ public static function evaluate($number) { + if (is_array($number)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $number); + } + try { $number = Helpers::validateNumericNullBool($number); } catch (Exception $e) { diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Angle.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Angle.php index 3062481f0..cbeec6f40 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Angle.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Angle.php @@ -2,21 +2,30 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\MathTrig; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception; class Angle { + use ArrayEnabled; + /** * DEGREES. * * Returns the result of builtin function rad2deg after validating args. * - * @param mixed $number Should be numeric + * @param mixed $number Should be numeric, or can be an array of numbers * - * @return float|string Rounded number + * @return array|float|string Rounded number + * If an array of numbers is passed as the argument, then the returned result will also be an array + * with the same dimensions */ public static function toDegrees($number) { + if (is_array($number)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $number); + } + try { $number = Helpers::validateNumericNullBool($number); } catch (Exception $e) { @@ -31,12 +40,18 @@ class Angle * * Returns the result of builtin function deg2rad after validating args. * - * @param mixed $number Should be numeric + * @param mixed $number Should be numeric, or can be an array of numbers * - * @return float|string Rounded number + * @return array|float|string Rounded number + * If an array of numbers is passed as the argument, then the returned result will also be an array + * with the same dimensions */ public static function toRadians($number) { + if (is_array($number)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $number); + } + try { $number = Helpers::validateNumericNullBool($number); } catch (Exception $e) { diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Arabic.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Arabic.php index b852eeacf..200d25784 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Arabic.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Arabic.php @@ -2,11 +2,14 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\MathTrig; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception; use PhpOffice\PhpSpreadsheet\Calculation\Functions; class Arabic { + use ArrayEnabled; + private const ROMAN_LOOKUP = [ 'M' => 1000, 'D' => 500, @@ -70,14 +73,20 @@ class Arabic * Excel Function: * ARABIC(text) * - * @param string $roman + * @param mixed $roman Should be a string, or can be an array of strings * - * @return int|string the arabic numberal contrived from the roman numeral + * @return array|int|string the arabic numberal contrived from the roman numeral + * If an array of numbers is passed as the argument, then the returned result will also be an array + * with the same dimensions */ public static function evaluate($roman) { + if (is_array($roman)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $roman); + } + // An empty string should return 0 - $roman = substr(trim(strtoupper((string) Functions::flattenSingleValue($roman))), 0, 255); + $roman = substr(trim(strtoupper((string) $roman)), 0, 255); if ($roman === '') { return 0; } diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Base.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Base.php index 4be7b7c79..a31a56813 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Base.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Base.php @@ -2,11 +2,14 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\MathTrig; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception; use PhpOffice\PhpSpreadsheet\Calculation\Functions; class Base { + use ArrayEnabled; + /** * BASE. * @@ -16,21 +19,37 @@ class Base * BASE(Number, Radix [Min_length]) * * @param mixed $number expect float + * Or can be an array of values * @param mixed $radix expect float + * Or can be an array of values * @param mixed $minLength expect int or null + * Or can be an array of values * - * @return string the text representation with the given radix (base) + * @return array|string the text representation with the given radix (base) + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function evaluate($number, $radix, $minLength = null) { + if (is_array($number) || is_array($radix) || is_array($minLength)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $number, $radix, $minLength); + } + try { $number = (float) floor(Helpers::validateNumericNullBool($number)); $radix = (int) Helpers::validateNumericNullBool($radix); } catch (Exception $e) { return $e->getMessage(); } - $minLength = Functions::flattenSingleValue($minLength); + return self::calculate($number, $radix, $minLength); + } + + /** + * @param mixed $minLength + */ + private static function calculate(float $number, int $radix, $minLength): string + { if ($minLength === null || is_numeric($minLength)) { if ($number < 0 || $number >= 2 ** 53 || $radix < 2 || $radix > 36) { return Functions::NAN(); // Numeric range constraints diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Ceiling.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Ceiling.php index 73f54a52f..fd17f653e 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Ceiling.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Ceiling.php @@ -2,11 +2,14 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\MathTrig; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception; use PhpOffice\PhpSpreadsheet\Calculation\Functions; class Ceiling { + use ArrayEnabled; + /** * CEILING. * @@ -18,13 +21,21 @@ class Ceiling * Excel Function: * CEILING(number[,significance]) * - * @param float $number the number you want the ceiling - * @param float $significance the multiple to which you want to round + * @param array|float $number the number you want the ceiling + * Or can be an array of values + * @param array|float $significance the multiple to which you want to round + * Or can be an array of values * - * @return float|string Rounded Number, or a string containing an error + * @return array|float|string Rounded Number, or a string containing an error + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function ceiling($number, $significance = null) { + if (is_array($number) || is_array($significance)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $number, $significance); + } + if ($significance === null) { self::floorCheck1Arg(); } @@ -48,13 +59,22 @@ class Ceiling * CEILING.MATH(number[,significance[,mode]]) * * @param mixed $number Number to round + * Or can be an array of values * @param mixed $significance Significance - * @param int $mode direction to round negative numbers + * Or can be an array of values + * @param array|int $mode direction to round negative numbers + * Or can be an array of values * - * @return float|string Rounded Number, or a string containing an error + * @return array|float|string Rounded Number, or a string containing an error + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function math($number, $significance = null, $mode = 0) { + if (is_array($number) || is_array($significance) || is_array($mode)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $number, $significance, $mode); + } + try { $number = Helpers::validateNumericNullBool($number); $significance = Helpers::validateNumericNullSubstitution($significance, ($number < 0) ? -1 : 1); @@ -82,12 +102,20 @@ class Ceiling * CEILING.PRECISE(number[,significance]) * * @param mixed $number the number you want to round - * @param float $significance the multiple to which you want to round + * Or can be an array of values + * @param array|float $significance the multiple to which you want to round + * Or can be an array of values * - * @return float|string Rounded Number, or a string containing an error + * @return array|float|string Rounded Number, or a string containing an error + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function precise($number, $significance = 1) { + if (is_array($number) || is_array($significance)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $number, $significance); + } + try { $number = Helpers::validateNumericNullBool($number); $significance = Helpers::validateNumericNullSubstitution($significance, null); diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Combinations.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Combinations.php index 97508bb1e..5a652da09 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Combinations.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Combinations.php @@ -2,10 +2,13 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\MathTrig; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception; class Combinations { + use ArrayEnabled; + /** * COMBIN. * @@ -15,13 +18,19 @@ class Combinations * Excel Function: * COMBIN(numObjs,numInSet) * - * @param mixed $numObjs Number of different objects - * @param mixed $numInSet Number of objects in each combination + * @param mixed $numObjs Number of different objects, or can be an array of numbers + * @param mixed $numInSet Number of objects in each combination, or can be an array of numbers * - * @return float|int|string Number of combinations, or a string containing an error + * @return array|float|int|string Number of combinations, or a string containing an error + * If an array of numbers is passed as the argument, then the returned result will also be an array + * with the same dimensions */ public static function withoutRepetition($numObjs, $numInSet) { + if (is_array($numObjs) || is_array($numInSet)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $numObjs, $numInSet); + } + try { $numObjs = Helpers::validateNumericNullSubstitution($numObjs, null); $numInSet = Helpers::validateNumericNullSubstitution($numInSet, null); @@ -35,21 +44,27 @@ class Combinations } /** - * COMBIN. + * COMBINA. * * Returns the number of combinations for a given number of items. Use COMBIN to * determine the total possible number of groups for a given number of items. * * Excel Function: - * COMBIN(numObjs,numInSet) + * COMBINA(numObjs,numInSet) * - * @param mixed $numObjs Number of different objects - * @param mixed $numInSet Number of objects in each combination + * @param mixed $numObjs Number of different objects, or can be an array of numbers + * @param mixed $numInSet Number of objects in each combination, or can be an array of numbers * - * @return float|int|string Number of combinations, or a string containing an error + * @return array|float|int|string Number of combinations, or a string containing an error + * If an array of numbers is passed as the argument, then the returned result will also be an array + * with the same dimensions */ public static function withRepetition($numObjs, $numInSet) { + if (is_array($numObjs) || is_array($numInSet)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $numObjs, $numInSet); + } + try { $numObjs = Helpers::validateNumericNullSubstitution($numObjs, null); $numInSet = Helpers::validateNumericNullSubstitution($numInSet, null); @@ -69,6 +84,8 @@ class Combinations return $e->getMessage(); } - return round(Factorial::fact($numObjs + $numInSet - 1) / Factorial::fact($numObjs - 1)) / Factorial::fact($numInSet); + return round( + Factorial::fact($numObjs + $numInSet - 1) / Factorial::fact($numObjs - 1) + ) / Factorial::fact($numInSet); } } diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Exp.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Exp.php index ce930a83a..f65c2c18b 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Exp.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Exp.php @@ -2,21 +2,30 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\MathTrig; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception; class Exp { + use ArrayEnabled; + /** * EXP. * * Returns the result of builtin function exp after validating args. * - * @param mixed $number Should be numeric + * @param mixed $number Should be numeric, or can be an array of numbers * - * @return float|string Rounded number + * @return array|float|string Rounded number + * If an array of numbers is passed as the argument, then the returned result will also be an array + * with the same dimensions */ public static function evaluate($number) { + if (is_array($number)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $number); + } + try { $number = Helpers::validateNumericNullBool($number); } catch (Exception $e) { diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Factorial.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Factorial.php index f443f8e59..b6883e290 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Factorial.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Factorial.php @@ -2,12 +2,15 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\MathTrig; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception; use PhpOffice\PhpSpreadsheet\Calculation\Functions; use PhpOffice\PhpSpreadsheet\Calculation\Statistical; class Factorial { + use ArrayEnabled; + /** * FACT. * @@ -17,12 +20,18 @@ class Factorial * Excel Function: * FACT(factVal) * - * @param float $factVal Factorial Value + * @param array|float $factVal Factorial Value, or can be an array of numbers * - * @return float|int|string Factorial, or a string containing an error + * @return array|float|int|string Factorial, or a string containing an error + * If an array of numbers is passed as the argument, then the returned result will also be an array + * with the same dimensions */ public static function fact($factVal) { + if (is_array($factVal)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $factVal); + } + try { $factVal = Helpers::validateNumericNullBool($factVal); Helpers::validateNotNegative($factVal); @@ -53,12 +62,18 @@ class Factorial * Excel Function: * FACTDOUBLE(factVal) * - * @param float $factVal Factorial Value + * @param array|float $factVal Factorial Value, or can be an array of numbers * - * @return float|int|string Double Factorial, or a string containing an error + * @return array|float|int|string Double Factorial, or a string containing an error + * If an array of numbers is passed as the argument, then the returned result will also be an array + * with the same dimensions */ public static function factDouble($factVal) { + if (is_array($factVal)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $factVal); + } + try { $factVal = Helpers::validateNumericNullSubstitution($factVal, 0); Helpers::validateNotNegative($factVal); diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Floor.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Floor.php index 04e122058..16cde987e 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Floor.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Floor.php @@ -2,11 +2,14 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\MathTrig; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception; use PhpOffice\PhpSpreadsheet\Calculation\Functions; class Floor { + use ArrayEnabled; + private static function floorCheck1Arg(): void { $compatibility = Functions::getCompatibilityMode(); @@ -24,12 +27,20 @@ class Floor * FLOOR(number[,significance]) * * @param mixed $number Expect float. Number to round + * Or can be an array of values * @param mixed $significance Expect float. Significance + * Or can be an array of values * - * @return float|string Rounded Number, or a string containing an error + * @return array|float|string Rounded Number, or a string containing an error + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function floor($number, $significance = null) { + if (is_array($number) || is_array($significance)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $number, $significance); + } + if ($significance === null) { self::floorCheck1Arg(); } @@ -53,13 +64,22 @@ class Floor * FLOOR.MATH(number[,significance[,mode]]) * * @param mixed $number Number to round + * Or can be an array of values * @param mixed $significance Significance + * Or can be an array of values * @param mixed $mode direction to round negative numbers + * Or can be an array of values * - * @return float|string Rounded Number, or a string containing an error + * @return array|float|string Rounded Number, or a string containing an error + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function math($number, $significance = null, $mode = 0) { + if (is_array($number) || is_array($significance) || is_array($mode)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $number, $significance, $mode); + } + try { $number = Helpers::validateNumericNullBool($number); $significance = Helpers::validateNumericNullSubstitution($significance, ($number < 0) ? -1 : 1); @@ -79,13 +99,21 @@ class Floor * Excel Function: * FLOOR.PRECISE(number[,significance]) * - * @param float $number Number to round - * @param float $significance Significance + * @param array|float $number Number to round + * Or can be an array of values + * @param array|float $significance Significance + * Or can be an array of values * - * @return float|string Rounded Number, or a string containing an error + * @return array|float|string Rounded Number, or a string containing an error + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function precise($number, $significance = 1) { + if (is_array($number) || is_array($significance)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $number, $significance); + } + try { $number = Helpers::validateNumericNullBool($number); $significance = Helpers::validateNumericNullSubstitution($significance, null); diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/IntClass.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/IntClass.php index 7aa3d06ae..f7f7764bc 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/IntClass.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/IntClass.php @@ -2,10 +2,13 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\MathTrig; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception; class IntClass { + use ArrayEnabled; + /** * INT. * @@ -14,12 +17,18 @@ class IntClass * Excel Function: * INT(number) * - * @param float $number Number to cast to an integer + * @param array|float $number Number to cast to an integer, or can be an array of numbers * - * @return int|string Integer value, or a string containing an error + * @return array|string Integer value, or a string containing an error + * If an array of numbers is passed as the argument, then the returned result will also be an array + * with the same dimensions */ public static function evaluate($number) { + if (is_array($number)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $number); + } + try { $number = Helpers::validateNumericNullBool($number); } catch (Exception $e) { diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Logarithms.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Logarithms.php index d6878d88c..7b07f09d5 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Logarithms.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Logarithms.php @@ -2,10 +2,13 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\MathTrig; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception; class Logarithms { + use ArrayEnabled; + /** * LOG_BASE. * @@ -15,12 +18,20 @@ class Logarithms * LOG(number[,base]) * * @param mixed $number The positive real number for which you want the logarithm + * Or can be an array of values * @param mixed $base The base of the logarithm. If base is omitted, it is assumed to be 10. + * Or can be an array of values * - * @return float|string The result, or a string containing an error + * @return array|float|string The result, or a string containing an error + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function withBase($number, $base = 10) { + if (is_array($number) || is_array($base)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $number, $base); + } + try { $number = Helpers::validateNumericNullBool($number); Helpers::validatePositive($number); @@ -39,11 +50,18 @@ class Logarithms * Returns the result of builtin function log after validating args. * * @param mixed $number Should be numeric + * Or can be an array of values * - * @return float|string Rounded number + * @return array|float|string Rounded number + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function base10($number) { + if (is_array($number)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $number); + } + try { $number = Helpers::validateNumericNullBool($number); Helpers::validatePositive($number); @@ -60,11 +78,18 @@ class Logarithms * Returns the result of builtin function log after validating args. * * @param mixed $number Should be numeric + * Or can be an array of values * - * @return float|string Rounded number + * @return array|float|string Rounded number + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function natural($number) { + if (is_array($number)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $number); + } + try { $number = Helpers::validateNumericNullBool($number); Helpers::validatePositive($number); diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/MatrixFunctions.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/MatrixFunctions.php index 92e1ff8e7..474f862d8 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/MatrixFunctions.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/MatrixFunctions.php @@ -12,7 +12,7 @@ use PhpOffice\PhpSpreadsheet\Calculation\Functions; class MatrixFunctions { /** - * Convert parameter to matrix. + * Convert parameter to Matrix. * * @param mixed $matrixValues A matrix of values */ @@ -42,6 +42,47 @@ class MatrixFunctions return new Matrix($matrixData); } + /** + * SEQUENCE. + * + * Generates a list of sequential numbers in an array. + * + * Excel Function: + * SEQUENCE(rows,[columns],[start],[step]) + * + * @param mixed $rows the number of rows to return, defaults to 1 + * @param mixed $columns the number of columns to return, defaults to 1 + * @param mixed $start the first number in the sequence, defaults to 1 + * @param mixed $step the amount to increment each subsequent value in the array, defaults to 1 + * + * @return array|string The resulting array, or a string containing an error + */ + public static function sequence($rows = 1, $columns = 1, $start = 1, $step = 1) + { + try { + $rows = (int) Helpers::validateNumericNullSubstitution($rows, 1); + Helpers::validatePositive($rows); + $columns = (int) Helpers::validateNumericNullSubstitution($columns, 1); + Helpers::validatePositive($columns); + $start = Helpers::validateNumericNullSubstitution($start, 1); + $step = Helpers::validateNumericNullSubstitution($step, 1); + } catch (Exception $e) { + return $e->getMessage(); + } + + if ($step === 0) { + return array_chunk( + array_fill(0, $rows * $columns, $start), + max($columns, 1) + ); + } + + return array_chunk( + range($start, $start + (($rows * $columns - 1) * $step), $step), + max($columns, 1) + ); + } + /** * MDETERM. * diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Operations.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Operations.php index 595c7fdcc..4e481512a 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Operations.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Operations.php @@ -2,21 +2,32 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\MathTrig; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception; use PhpOffice\PhpSpreadsheet\Calculation\Functions; class Operations { + use ArrayEnabled; + /** * MOD. * * @param mixed $dividend Dividend + * Or can be an array of values * @param mixed $divisor Divisor + * Or can be an array of values * - * @return float|int|string Remainder, or a string containing an error + * @return array|float|int|string Remainder, or a string containing an error + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function mod($dividend, $divisor) { + if (is_array($dividend) || is_array($divisor)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $dividend, $divisor); + } + try { $dividend = Helpers::validateNumericNullBool($dividend); $divisor = Helpers::validateNumericNullBool($divisor); @@ -40,13 +51,21 @@ class Operations * * Computes x raised to the power y. * - * @param float|int $x - * @param float|int $y + * @param array|float|int $x + * Or can be an array of values + * @param array|float|int $y + * Or can be an array of values * - * @return float|int|string The result, or a string containing an error + * @return array|float|int|string The result, or a string containing an error + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function power($x, $y) { + if (is_array($x) || is_array($y)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $x, $y); + } + try { $x = Helpers::validateNumericNullBool($x); $y = Helpers::validateNumericNullBool($y); @@ -117,12 +136,20 @@ class Operations * QUOTIENT(value1,value2) * * @param mixed $numerator Expect float|int + * Or can be an array of values * @param mixed $denominator Expect float|int + * Or can be an array of values * - * @return int|string + * @return array|int|string + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function quotient($numerator, $denominator) { + if (is_array($numerator) || is_array($denominator)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $numerator, $denominator); + } + try { $numerator = Helpers::validateNumericNullSubstitution($numerator, 0); $denominator = Helpers::validateNumericNullSubstitution($denominator, 0); diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Random.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Random.php index 963a789ac..76e983e59 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Random.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Random.php @@ -2,10 +2,14 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\MathTrig; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception; +use PhpOffice\PhpSpreadsheet\Calculation\Functions; class Random { + use ArrayEnabled; + /** * RAND. * @@ -20,12 +24,20 @@ class Random * RANDBETWEEN. * * @param mixed $min Minimal value + * Or can be an array of values * @param mixed $max Maximal value + * Or can be an array of values * - * @return float|int|string Random number + * @return array|float|int|string Random number + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function randBetween($min, $max) { + if (is_array($min) || is_array($max)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $min, $max); + } + try { $min = (int) Helpers::validateNumericNullBool($min); $max = (int) Helpers::validateNumericNullBool($max); @@ -36,4 +48,52 @@ class Random return mt_rand($min, $max); } + + /** + * RANDARRAY. + * + * Generates a list of sequential numbers in an array. + * + * Excel Function: + * RANDARRAY([rows],[columns],[start],[step]) + * + * @param mixed $rows the number of rows to return, defaults to 1 + * @param mixed $columns the number of columns to return, defaults to 1 + * @param mixed $min the minimum number to be returned, defaults to 0 + * @param mixed $max the maximum number to be returned, defaults to 1 + * @param bool $wholeNumber the type of numbers to return: + * False - Decimal numbers to 15 decimal places. (default) + * True - Whole (integer) numbers + * + * @return array|string The resulting array, or a string containing an error + */ + public static function randArray($rows = 1, $columns = 1, $min = 0, $max = 1, $wholeNumber = false) + { + try { + $rows = (int) Helpers::validateNumericNullSubstitution($rows, 1); + Helpers::validatePositive($rows); + $columns = (int) Helpers::validateNumericNullSubstitution($columns, 1); + Helpers::validatePositive($columns); + $min = Helpers::validateNumericNullSubstitution($min, 1); + $max = Helpers::validateNumericNullSubstitution($max, 1); + + if ($max <= $min) { + return Functions::VALUE(); + } + } catch (Exception $e) { + return $e->getMessage(); + } + + return array_chunk( + array_map( + function () use ($min, $max, $wholeNumber) { + return $wholeNumber + ? mt_rand((int) $min, (int) $max) + : (mt_rand() / mt_getrandmax()) * ($max - $min) + $min; + }, + array_fill(0, $rows * $columns, $min) + ), + max($columns, 1) + ); + } } diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Roman.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Roman.php index 71a6df3ad..7d771b296 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Roman.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Roman.php @@ -2,11 +2,14 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\MathTrig; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception; use PhpOffice\PhpSpreadsheet\Calculation\Functions; class Roman { + use ArrayEnabled; + private const VALUES = [ 45 => ['VL'], 46 => ['VLI'], @@ -814,12 +817,20 @@ class Roman * Converts a number to Roman numeral * * @param mixed $aValue Number to convert + * Or can be an array of numbers * @param mixed $style Number indicating one of five possible forms + * Or can be an array of styles * - * @return string Roman numeral, or a string containing an error + * @return array|string Roman numeral, or a string containing an error + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function evaluate($aValue, $style = 0) { + if (is_array($aValue) || is_array($style)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $aValue, $style); + } + try { $aValue = Helpers::validateNumericNullBool($aValue); if (is_bool($style)) { diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Round.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Round.php index 2ddde9000..c419ca4d7 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Round.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Round.php @@ -2,23 +2,32 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\MathTrig; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception; use PhpOffice\PhpSpreadsheet\Calculation\Functions; class Round { + use ArrayEnabled; + /** * ROUND. * * Returns the result of builtin function round after validating args. * - * @param mixed $number Should be numeric - * @param mixed $precision Should be int + * @param mixed $number Should be numeric, or can be an array of numbers + * @param mixed $precision Should be int, or can be an array of numbers * - * @return float|string Rounded number + * @return array|float|string Rounded number + * If an array of numbers is passed as the argument, then the returned result will also be an array + * with the same dimensions */ public static function round($number, $precision) { + if (is_array($number) || is_array($precision)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $number, $precision); + } + try { $number = Helpers::validateNumericNullBool($number); $precision = Helpers::validateNumericNullBool($precision); @@ -34,13 +43,19 @@ class Round * * Rounds a number up to a specified number of decimal places * - * @param float $number Number to round - * @param int $digits Number of digits to which you want to round $number + * @param array|float $number Number to round, or can be an array of numbers + * @param array|int $digits Number of digits to which you want to round $number, or can be an array of numbers * - * @return float|string Rounded Number, or a string containing an error + * @return array|float|string Rounded Number, or a string containing an error + * If an array of numbers is passed as the argument, then the returned result will also be an array + * with the same dimensions */ public static function up($number, $digits) { + if (is_array($number) || is_array($digits)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $number, $digits); + } + try { $number = Helpers::validateNumericNullBool($number); $digits = (int) Helpers::validateNumericNullSubstitution($digits, null); @@ -64,13 +79,19 @@ class Round * * Rounds a number down to a specified number of decimal places * - * @param float $number Number to round - * @param int $digits Number of digits to which you want to round $number + * @param array|float $number Number to round, or can be an array of numbers + * @param array|int $digits Number of digits to which you want to round $number, or can be an array of numbers * - * @return float|string Rounded Number, or a string containing an error + * @return array|float|string Rounded Number, or a string containing an error + * If an array of numbers is passed as the argument, then the returned result will also be an array + * with the same dimensions */ public static function down($number, $digits) { + if (is_array($number) || is_array($digits)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $number, $digits); + } + try { $number = Helpers::validateNumericNullBool($number); $digits = (int) Helpers::validateNumericNullSubstitution($digits, null); @@ -94,13 +115,19 @@ class Round * * Rounds a number to the nearest multiple of a specified value * - * @param mixed $number Expect float. Number to round. - * @param mixed $multiple Expect int. Multiple to which you want to round. + * @param mixed $number Expect float. Number to round, or can be an array of numbers + * @param mixed $multiple Expect int. Multiple to which you want to round, or can be an array of numbers. * - * @return float|string Rounded Number, or a string containing an error + * @return array|float|string Rounded Number, or a string containing an error + * If an array of numbers is passed as the argument, then the returned result will also be an array + * with the same dimensions */ public static function multiple($number, $multiple) { + if (is_array($number) || is_array($multiple)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $number, $multiple); + } + try { $number = Helpers::validateNumericNullSubstitution($number, 0); $multiple = Helpers::validateNumericNullSubstitution($multiple, null); @@ -132,12 +159,18 @@ class Round * Excel Function: * EVEN(number) * - * @param float $number Number to round + * @param array|float $number Number to round, or can be an array of numbers * - * @return float|string Rounded Number, or a string containing an error + * @return array|float|string Rounded Number, or a string containing an error + * If an array of numbers is passed as the argument, then the returned result will also be an array + * with the same dimensions */ public static function even($number) { + if (is_array($number)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $number); + } + try { $number = Helpers::validateNumericNullBool($number); } catch (Exception $e) { @@ -152,12 +185,18 @@ class Round * * Returns number rounded up to the nearest odd integer. * - * @param float $number Number to round + * @param array|float $number Number to round, or can be an array of numbers * - * @return float|string Rounded Number, or a string containing an error + * @return array|float|string Rounded Number, or a string containing an error + * If an array of numbers is passed as the argument, then the returned result will also be an array + * with the same dimensions */ public static function odd($number) { + if (is_array($number)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $number); + } + try { $number = Helpers::validateNumericNullBool($number); } catch (Exception $e) { diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/SeriesSum.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/SeriesSum.php index 2ada9df4e..ecce359fc 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/SeriesSum.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/SeriesSum.php @@ -2,11 +2,14 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\MathTrig; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception; use PhpOffice\PhpSpreadsheet\Calculation\Functions; class SeriesSum { + use ArrayEnabled; + /** * SERIESSUM. * @@ -17,10 +20,14 @@ class SeriesSum * @param mixed $m Step * @param mixed[] $args An array of coefficients for the Data Series * - * @return float|string The result, or a string containing an error + * @return array|float|string The result, or a string containing an error */ public static function evaluate($x, $n, $m, ...$args) { + if (is_array($x) || is_array($n) || is_array($m)) { + return self::evaluateArrayArgumentsSubset([self::class, __FUNCTION__], 3, $x, $n, $m, ...$args); + } + try { $x = Helpers::validateNumericNullSubstitution($x, 0); $n = Helpers::validateNumericNullSubstitution($n, 0); diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Sign.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Sign.php index a48cf0f9b..e40e1f6d3 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Sign.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Sign.php @@ -2,22 +2,31 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\MathTrig; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception; class Sign { + use ArrayEnabled; + /** * SIGN. * * Determines the sign of a number. Returns 1 if the number is positive, zero (0) * if the number is 0, and -1 if the number is negative. * - * @param float $number Number to round + * @param array|float $number Number to round, or can be an array of numbers * - * @return int|string sign value, or a string containing an error + * @return array|int|string sign value, or a string containing an error + * If an array of numbers is passed as the argument, then the returned result will also be an array + * with the same dimensions */ public static function evaluate($number) { + if (is_array($number)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $number); + } + try { $number = Helpers::validateNumericNullBool($number); } catch (Exception $e) { diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Sqrt.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Sqrt.php index 8ead578e3..bb9f15fda 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Sqrt.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Sqrt.php @@ -2,21 +2,30 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\MathTrig; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception; class Sqrt { + use ArrayEnabled; + /** * SQRT. * * Returns the result of builtin function sqrt after validating args. * - * @param mixed $number Should be numeric + * @param mixed $number Should be numeric, or can be an array of numbers * - * @return float|string square roor + * @return array|float|string square root + * If an array of numbers is passed as the argument, then the returned result will also be an array + * with the same dimensions */ public static function sqrt($number) { + if (is_array($number)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $number); + } + try { $number = Helpers::validateNumericNullBool($number); } catch (Exception $e) { @@ -31,12 +40,18 @@ class Sqrt * * Returns the square root of (number * pi). * - * @param float $number Number + * @param array|float $number Number, or can be an array of numbers * - * @return float|string Square Root of Number * Pi, or a string containing an error + * @return array|float|string Square Root of Number * Pi, or a string containing an error + * If an array of numbers is passed as the argument, then the returned result will also be an array + * with the same dimensions */ public static function pi($number) { + if (is_array($number)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $number); + } + try { $number = Helpers::validateNumericNullSubstitution($number, 0); Helpers::validateNotNegative($number); diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Subtotal.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Subtotal.php index 2edb86f7e..be065791f 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Subtotal.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Subtotal.php @@ -39,7 +39,10 @@ class Subtotal if ($cellReference->getWorksheet()->cellExists($column . $row)) { //take this cell out if it contains the SUBTOTAL or AGGREGATE functions in a formula $isFormula = $cellReference->getWorksheet()->getCell($column . $row)->isFormula(); - $cellFormula = !preg_match('/^=.*\b(SUBTOTAL|AGGREGATE)\s*\(/i', $cellReference->getWorksheet()->getCell($column . $row)->getValue()); + $cellFormula = !preg_match( + '/^=.*\b(SUBTOTAL|AGGREGATE)\s*\(/i', + $cellReference->getWorksheet()->getCell($column . $row)->getValue() ?? '' + ); $retVal = !$isFormula || $cellFormula; } @@ -52,17 +55,17 @@ class Subtotal /** @var callable[] */ private const CALL_FUNCTIONS = [ - 1 => [Statistical\Averages::class, 'average'], - [Statistical\Counts::class, 'COUNT'], // 2 - [Statistical\Counts::class, 'COUNTA'], // 3 - [Statistical\Maximum::class, 'max'], // 4 - [Statistical\Minimum::class, 'min'], // 5 - [Operations::class, 'product'], // 6 - [Statistical\StandardDeviations::class, 'STDEV'], // 7 - [Statistical\StandardDeviations::class, 'STDEVP'], // 8 - [Sum::class, 'sumIgnoringStrings'], // 9 - [Statistical\Variances::class, 'VAR'], // 10 - [Statistical\Variances::class, 'VARP'], // 11 + 1 => [Statistical\Averages::class, 'average'], // 1 and 101 + [Statistical\Counts::class, 'COUNT'], // 2 and 102 + [Statistical\Counts::class, 'COUNTA'], // 3 and 103 + [Statistical\Maximum::class, 'max'], // 4 and 104 + [Statistical\Minimum::class, 'min'], // 5 and 105 + [Operations::class, 'product'], // 6 and 106 + [Statistical\StandardDeviations::class, 'STDEV'], // 7 and 107 + [Statistical\StandardDeviations::class, 'STDEVP'], // 8 and 108 + [Sum::class, 'sumIgnoringStrings'], // 9 and 109 + [Statistical\Variances::class, 'VAR'], // 10 and 110 + [Statistical\Variances::class, 'VARP'], // 111 and 111 ]; /** diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Trig/Cosecant.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Trig/Cosecant.php index 3038e6cc0..845b6c146 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Trig/Cosecant.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Trig/Cosecant.php @@ -2,22 +2,31 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\MathTrig\Trig; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception; use PhpOffice\PhpSpreadsheet\Calculation\MathTrig\Helpers; class Cosecant { + use ArrayEnabled; + /** * CSC. * * Returns the cosecant of an angle. * - * @param float $angle Number + * @param array|float $angle Number, or can be an array of numbers * - * @return float|string The cosecant of the angle + * @return array|float|string The cosecant of the angle + * If an array of numbers is passed as the argument, then the returned result will also be an array + * with the same dimensions */ public static function csc($angle) { + if (is_array($angle)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $angle); + } + try { $angle = Helpers::validateNumericNullBool($angle); } catch (Exception $e) { @@ -32,12 +41,18 @@ class Cosecant * * Returns the hyperbolic cosecant of an angle. * - * @param float $angle Number + * @param array|float $angle Number, or can be an array of numbers * - * @return float|string The hyperbolic cosecant of the angle + * @return array|float|string The hyperbolic cosecant of the angle + * If an array of numbers is passed as the argument, then the returned result will also be an array + * with the same dimensions */ public static function csch($angle) { + if (is_array($angle)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $angle); + } + try { $angle = Helpers::validateNumericNullBool($angle); } catch (Exception $e) { diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Trig/Cosine.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Trig/Cosine.php index 6c69e126d..c06f04dfc 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Trig/Cosine.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Trig/Cosine.php @@ -2,22 +2,31 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\MathTrig\Trig; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception; use PhpOffice\PhpSpreadsheet\Calculation\MathTrig\Helpers; class Cosine { + use ArrayEnabled; + /** * COS. * * Returns the result of builtin function cos after validating args. * - * @param mixed $number Should be numeric + * @param mixed $number Should be numeric, or can be an array of numbers * - * @return float|string cosine + * @return array|float|string cosine + * If an array of numbers is passed as the argument, then the returned result will also be an array + * with the same dimensions */ public static function cos($number) { + if (is_array($number)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $number); + } + try { $number = Helpers::validateNumericNullBool($number); } catch (Exception $e) { @@ -32,12 +41,18 @@ class Cosine * * Returns the result of builtin function cosh after validating args. * - * @param mixed $number Should be numeric + * @param mixed $number Should be numeric, or can be an array of numbers * - * @return float|string hyperbolic cosine + * @return array|float|string hyperbolic cosine + * If an array of numbers is passed as the argument, then the returned result will also be an array + * with the same dimensions */ public static function cosh($number) { + if (is_array($number)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $number); + } + try { $number = Helpers::validateNumericNullBool($number); } catch (Exception $e) { @@ -52,12 +67,18 @@ class Cosine * * Returns the arccosine of a number. * - * @param float $number Number + * @param array|float $number Number, or can be an array of numbers * - * @return float|string The arccosine of the number + * @return array|float|string The arccosine of the number + * If an array of numbers is passed as the argument, then the returned result will also be an array + * with the same dimensions */ public static function acos($number) { + if (is_array($number)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $number); + } + try { $number = Helpers::validateNumericNullBool($number); } catch (Exception $e) { @@ -72,12 +93,18 @@ class Cosine * * Returns the arc inverse hyperbolic cosine of a number. * - * @param float $number Number + * @param array|float $number Number, or can be an array of numbers * - * @return float|string The inverse hyperbolic cosine of the number, or an error string + * @return array|float|string The inverse hyperbolic cosine of the number, or an error string + * If an array of numbers is passed as the argument, then the returned result will also be an array + * with the same dimensions */ public static function acosh($number) { + if (is_array($number)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $number); + } + try { $number = Helpers::validateNumericNullBool($number); } catch (Exception $e) { diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Trig/Cotangent.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Trig/Cotangent.php index 1b796f50f..eeedef9bf 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Trig/Cotangent.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Trig/Cotangent.php @@ -2,22 +2,31 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\MathTrig\Trig; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception; use PhpOffice\PhpSpreadsheet\Calculation\MathTrig\Helpers; class Cotangent { + use ArrayEnabled; + /** * COT. * * Returns the cotangent of an angle. * - * @param float $angle Number + * @param array|float $angle Number, or can be an array of numbers * - * @return float|string The cotangent of the angle + * @return array|float|string The cotangent of the angle + * If an array of numbers is passed as the argument, then the returned result will also be an array + * with the same dimensions */ public static function cot($angle) { + if (is_array($angle)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $angle); + } + try { $angle = Helpers::validateNumericNullBool($angle); } catch (Exception $e) { @@ -32,12 +41,18 @@ class Cotangent * * Returns the hyperbolic cotangent of an angle. * - * @param float $angle Number + * @param array|float $angle Number, or can be an array of numbers * - * @return float|string The hyperbolic cotangent of the angle + * @return array|float|string The hyperbolic cotangent of the angle + * If an array of numbers is passed as the argument, then the returned result will also be an array + * with the same dimensions */ public static function coth($angle) { + if (is_array($angle)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $angle); + } + try { $angle = Helpers::validateNumericNullBool($angle); } catch (Exception $e) { @@ -52,12 +67,18 @@ class Cotangent * * Returns the arccotangent of a number. * - * @param float $number Number + * @param array|float $number Number, or can be an array of numbers * - * @return float|string The arccotangent of the number + * @return array|float|string The arccotangent of the number + * If an array of numbers is passed as the argument, then the returned result will also be an array + * with the same dimensions */ public static function acot($number) { + if (is_array($number)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $number); + } + try { $number = Helpers::validateNumericNullBool($number); } catch (Exception $e) { @@ -72,12 +93,18 @@ class Cotangent * * Returns the hyperbolic arccotangent of a number. * - * @param float $number Number + * @param array|float $number Number, or can be an array of numbers * - * @return float|string The hyperbolic arccotangent of the number + * @return array|float|string The hyperbolic arccotangent of the number + * If an array of numbers is passed as the argument, then the returned result will also be an array + * with the same dimensions */ public static function acoth($number) { + if (is_array($number)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $number); + } + try { $number = Helpers::validateNumericNullBool($number); } catch (Exception $e) { diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Trig/Secant.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Trig/Secant.php index 70299cb7e..2d26e5ddf 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Trig/Secant.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Trig/Secant.php @@ -2,22 +2,31 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\MathTrig\Trig; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception; use PhpOffice\PhpSpreadsheet\Calculation\MathTrig\Helpers; class Secant { + use ArrayEnabled; + /** * SEC. * * Returns the secant of an angle. * - * @param float $angle Number + * @param array|float $angle Number, or can be an array of numbers * - * @return float|string The secant of the angle + * @return array|float|string The secant of the angle + * If an array of numbers is passed as the argument, then the returned result will also be an array + * with the same dimensions */ public static function sec($angle) { + if (is_array($angle)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $angle); + } + try { $angle = Helpers::validateNumericNullBool($angle); } catch (Exception $e) { @@ -32,12 +41,18 @@ class Secant * * Returns the hyperbolic secant of an angle. * - * @param float $angle Number + * @param array|float $angle Number, or can be an array of numbers * - * @return float|string The hyperbolic secant of the angle + * @return array|float|string The hyperbolic secant of the angle + * If an array of numbers is passed as the argument, then the returned result will also be an array + * with the same dimensions */ public static function sech($angle) { + if (is_array($angle)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $angle); + } + try { $angle = Helpers::validateNumericNullBool($angle); } catch (Exception $e) { diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Trig/Sine.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Trig/Sine.php index 2c6a8a071..6af568ce2 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Trig/Sine.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Trig/Sine.php @@ -2,22 +2,31 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\MathTrig\Trig; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception; use PhpOffice\PhpSpreadsheet\Calculation\MathTrig\Helpers; class Sine { + use ArrayEnabled; + /** * SIN. * * Returns the result of builtin function sin after validating args. * - * @param mixed $angle Should be numeric + * @param mixed $angle Should be numeric, or can be an array of numbers * - * @return float|string sine + * @return array|float|string sine + * If an array of numbers is passed as the argument, then the returned result will also be an array + * with the same dimensions */ public static function sin($angle) { + if (is_array($angle)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $angle); + } + try { $angle = Helpers::validateNumericNullBool($angle); } catch (Exception $e) { @@ -32,12 +41,18 @@ class Sine * * Returns the result of builtin function sinh after validating args. * - * @param mixed $angle Should be numeric + * @param mixed $angle Should be numeric, or can be an array of numbers * - * @return float|string hyperbolic sine + * @return array|float|string hyperbolic sine + * If an array of numbers is passed as the argument, then the returned result will also be an array + * with the same dimensions */ public static function sinh($angle) { + if (is_array($angle)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $angle); + } + try { $angle = Helpers::validateNumericNullBool($angle); } catch (Exception $e) { @@ -52,12 +67,18 @@ class Sine * * Returns the arcsine of a number. * - * @param float $number Number + * @param array|float $number Number, or can be an array of numbers * - * @return float|string The arcsine of the number + * @return array|float|string The arcsine of the number + * If an array of numbers is passed as the argument, then the returned result will also be an array + * with the same dimensions */ public static function asin($number) { + if (is_array($number)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $number); + } + try { $number = Helpers::validateNumericNullBool($number); } catch (Exception $e) { @@ -72,12 +93,18 @@ class Sine * * Returns the inverse hyperbolic sine of a number. * - * @param float $number Number + * @param array|float $number Number, or can be an array of numbers * - * @return float|string The inverse hyperbolic sine of the number + * @return array|float|string The inverse hyperbolic sine of the number + * If an array of numbers is passed as the argument, then the returned result will also be an array + * with the same dimensions */ public static function asinh($number) { + if (is_array($number)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $number); + } + try { $number = Helpers::validateNumericNullBool($number); } catch (Exception $e) { diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Trig/Tangent.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Trig/Tangent.php index 6cd235fb7..26bd44f72 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Trig/Tangent.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Trig/Tangent.php @@ -2,23 +2,32 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\MathTrig\Trig; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception; use PhpOffice\PhpSpreadsheet\Calculation\Functions; use PhpOffice\PhpSpreadsheet\Calculation\MathTrig\Helpers; class Tangent { + use ArrayEnabled; + /** * TAN. * * Returns the result of builtin function tan after validating args. * - * @param mixed $angle Should be numeric + * @param mixed $angle Should be numeric, or can be an array of numbers * - * @return float|string tangent + * @return array|float|string tangent + * If an array of numbers is passed as the argument, then the returned result will also be an array + * with the same dimensions */ public static function tan($angle) { + if (is_array($angle)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $angle); + } + try { $angle = Helpers::validateNumericNullBool($angle); } catch (Exception $e) { @@ -33,12 +42,18 @@ class Tangent * * Returns the result of builtin function sinh after validating args. * - * @param mixed $angle Should be numeric + * @param mixed $angle Should be numeric, or can be an array of numbers * - * @return float|string hyperbolic tangent + * @return array|float|string hyperbolic tangent + * If an array of numbers is passed as the argument, then the returned result will also be an array + * with the same dimensions */ public static function tanh($angle) { + if (is_array($angle)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $angle); + } + try { $angle = Helpers::validateNumericNullBool($angle); } catch (Exception $e) { @@ -53,12 +68,18 @@ class Tangent * * Returns the arctangent of a number. * - * @param float $number Number + * @param array|float $number Number, or can be an array of numbers * - * @return float|string The arctangent of the number + * @return array|float|string The arctangent of the number + * If an array of numbers is passed as the argument, then the returned result will also be an array + * with the same dimensions */ public static function atan($number) { + if (is_array($number)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $number); + } + try { $number = Helpers::validateNumericNullBool($number); } catch (Exception $e) { @@ -73,12 +94,18 @@ class Tangent * * Returns the inverse hyperbolic tangent of a number. * - * @param float $number Number + * @param array|float $number Number, or can be an array of numbers * - * @return float|string The inverse hyperbolic tangent of the number + * @return array|float|string The inverse hyperbolic tangent of the number + * If an array of numbers is passed as the argument, then the returned result will also be an array + * with the same dimensions */ public static function atanh($number) { + if (is_array($number)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $number); + } + try { $number = Helpers::validateNumericNullBool($number); } catch (Exception $e) { @@ -104,13 +131,20 @@ class Tangent * Excel Function: * ATAN2(xCoordinate,yCoordinate) * - * @param mixed $xCoordinate should be float, the x-coordinate of the point - * @param mixed $yCoordinate should be float, the y-coordinate of the point + * @param mixed $xCoordinate should be float, the x-coordinate of the point, or can be an array of numbers + * @param mixed $yCoordinate should be float, the y-coordinate of the point, or can be an array of numbers * - * @return float|string the inverse tangent of the specified x- and y-coordinates, or a string containing an error + * @return array|float|string + * The inverse tangent of the specified x- and y-coordinates, or a string containing an error + * If an array of numbers is passed as one of the arguments, then the returned result will also be an array + * with the same dimensions */ public static function atan2($xCoordinate, $yCoordinate) { + if (is_array($xCoordinate) || is_array($yCoordinate)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $xCoordinate, $yCoordinate); + } + try { $xCoordinate = Helpers::validateNumericNullBool($xCoordinate); $yCoordinate = Helpers::validateNumericNullBool($yCoordinate); diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Trunc.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Trunc.php index 4b3670f68..943e209dd 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Trunc.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Trunc.php @@ -2,22 +2,33 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\MathTrig; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception; class Trunc { + use ArrayEnabled; + /** * TRUNC. * * Truncates value to the number of fractional digits by number_digits. * - * @param float $value - * @param int $digits + * @param array|float $value + * Or can be an array of values + * @param array|int $digits + * Or can be an array of values * - * @return float|string Truncated value, or a string containing an error + * @return array|float|string Truncated value, or a string containing an error + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function evaluate($value = 0, $digits = 0) { + if (is_array($value) || is_array($digits)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $digits); + } + try { $value = Helpers::validateNumericNullBool($value); $digits = Helpers::validateNumericNullSubstitution($digits, null); diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical.php index d43a85f90..73db0aa77 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical.php @@ -130,7 +130,7 @@ class Statistical * @param mixed $rMin * @param mixed $rMax * - * @return float|string + * @return array|float|string */ public static function BETADIST($value, $alpha, $beta, $rMin = 0, $rMax = 1) { @@ -153,7 +153,7 @@ class Statistical * @param float $rMin Minimum value * @param float $rMax Maximum value * - * @return float|string + * @return array|float|string */ public static function BETAINV($probability, $alpha, $beta, $rMin = 0, $rMax = 1) { @@ -179,7 +179,7 @@ class Statistical * @param mixed $probability Probability of success on each trial * @param mixed $cumulative * - * @return float|string + * @return array|float|string */ public static function BINOMDIST($value, $trials, $probability, $cumulative) { @@ -199,7 +199,7 @@ class Statistical * @param float $value Value for the function * @param float $degrees degrees of freedom * - * @return float|string + * @return array|float|string */ public static function CHIDIST($value, $degrees) { @@ -219,7 +219,7 @@ class Statistical * @param float $probability Probability for the function * @param float $degrees degrees of freedom * - * @return float|string + * @return array|float|string */ public static function CHIINV($probability, $degrees) { @@ -240,7 +240,7 @@ class Statistical * @param float $stdDev Standard Deviation * @param float $size * - * @return float|string + * @return array|float|string */ public static function CONFIDENCE($alpha, $stdDev, $size) { @@ -415,7 +415,7 @@ class Statistical * @param float $probability probability of a success on each trial * @param float $alpha criterion value * - * @return int|string + * @return array|int|string */ public static function CRITBINOM($trials, $probability, $alpha) { @@ -460,7 +460,7 @@ class Statistical * @param float $lambda The parameter value * @param bool $cumulative * - * @return float|string + * @return array|float|string */ public static function EXPONDIST($value, $lambda, $cumulative) { @@ -486,7 +486,7 @@ class Statistical * @param bool $cumulative If cumulative is TRUE, F.DIST returns the cumulative distribution function; * if FALSE, it returns the probability density function. * - * @return float|string + * @return array|float|string */ public static function FDIST2($value, $u, $v, $cumulative) { @@ -507,7 +507,7 @@ class Statistical * * @param float $value * - * @return float|string + * @return array|float|string */ public static function FISHER($value) { @@ -528,7 +528,7 @@ class Statistical * * @param float $value * - * @return float|string + * @return array|float|string */ public static function FISHERINV($value) { @@ -549,7 +549,7 @@ class Statistical * @param mixed $yValues array of mixed Data Series Y * @param mixed $xValues of mixed Data Series X * - * @return bool|float|string + * @return array|bool|float|string */ public static function FORECAST($xValue, $yValues, $xValues) { @@ -568,7 +568,7 @@ class Statistical * * @param float $value * - * @return float|string The result, or a string containing an error + * @return array|float|string The result, or a string containing an error */ public static function GAMMAFunction($value) { @@ -590,7 +590,7 @@ class Statistical * @param float $b Parameter to the distribution * @param bool $cumulative * - * @return float|string + * @return array|float|string */ public static function GAMMADIST($value, $a, $b, $cumulative) { @@ -611,7 +611,7 @@ class Statistical * @param float $alpha Parameter to the distribution * @param float $beta Parameter to the distribution * - * @return float|string + * @return array|float|string */ public static function GAMMAINV($probability, $alpha, $beta) { @@ -630,7 +630,7 @@ class Statistical * * @param float $value * - * @return float|string + * @return array|float|string */ public static function GAMMALN($value) { @@ -650,7 +650,7 @@ class Statistical * * @param float $value * - * @return float|string The result, or a string containing an error + * @return array|float|string The result, or a string containing an error */ public static function GAUSS($value) { @@ -742,7 +742,7 @@ class Statistical * @param mixed $populationSuccesses Number of successes in the population * @param mixed $populationNumber Population size * - * @return float|string + * @return array|float|string */ public static function HYPGEOMDIST($sampleSuccesses, $sampleNumber, $populationSuccesses, $populationNumber) { @@ -879,7 +879,7 @@ class Statistical * @param float $mean * @param float $stdDev * - * @return float|string The result, or a string containing an error + * @return array|float|string The result, or a string containing an error * * @TODO Try implementing P J Acklam's refinement algorithm for greater * accuracy if I can get my head round the mathematics @@ -905,7 +905,7 @@ class Statistical * @param float $mean * @param float $stdDev * - * @return float|string The result, or a string containing an error + * @return array|float|string The result, or a string containing an error */ public static function LOGNORMDIST($value, $mean, $stdDev) { @@ -928,7 +928,7 @@ class Statistical * @param float $stdDev * @param bool $cumulative * - * @return float|string The result, or a string containing an error + * @return array|float|string The result, or a string containing an error */ public static function LOGNORMDIST2($value, $mean, $stdDev, $cumulative = false) { @@ -1131,7 +1131,7 @@ class Statistical * @param mixed $successes Threshold number of Successes * @param mixed $probability Probability of success on each trial * - * @return float|string The result, or a string containing an error + * @return array|float|string The result, or a string containing an error */ public static function NEGBINOMDIST($failures, $successes, $probability) { @@ -1155,7 +1155,7 @@ class Statistical * @param mixed $stdDev Standard Deviation * @param mixed $cumulative * - * @return float|string The result, or a string containing an error + * @return array|float|string The result, or a string containing an error */ public static function NORMDIST($value, $mean, $stdDev, $cumulative) { @@ -1176,7 +1176,7 @@ class Statistical * @param mixed $mean Mean Value * @param mixed $stdDev Standard Deviation * - * @return float|string The result, or a string containing an error + * @return array|float|string The result, or a string containing an error */ public static function NORMINV($probability, $mean, $stdDev) { @@ -1197,7 +1197,7 @@ class Statistical * * @param mixed $value * - * @return float|string The result, or a string containing an error + * @return array|float|string The result, or a string containing an error */ public static function NORMSDIST($value) { @@ -1219,7 +1219,7 @@ class Statistical * @param mixed $value * @param mixed $cumulative * - * @return float|string The result, or a string containing an error + * @return array|float|string The result, or a string containing an error */ public static function NORMSDIST2($value, $cumulative) { @@ -1238,7 +1238,7 @@ class Statistical * * @param mixed $value * - * @return float|string The result, or a string containing an error + * @return array|float|string The result, or a string containing an error */ public static function NORMSINV($value) { @@ -1308,7 +1308,7 @@ class Statistical * @param int $numObjs Number of different objects * @param int $numInSet Number of objects in each permutation * - * @return float|int|string Number of permutations, or a string containing an error + * @return array|float|int|string Number of permutations, or a string containing an error */ public static function PERMUT($numObjs, $numInSet) { @@ -1331,7 +1331,7 @@ class Statistical * @param mixed $mean Mean Value * @param mixed $cumulative * - * @return float|string The result, or a string containing an error + * @return array|float|string The result, or a string containing an error */ public static function POISSON($value, $mean, $cumulative) { @@ -1480,7 +1480,7 @@ class Statistical * @param float $mean Mean Value * @param float $stdDev Standard Deviation * - * @return float|string Standardized value, or a string containing an error + * @return array|float|string Standardized value, or a string containing an error */ public static function STANDARDIZE($value, $mean, $stdDev) { @@ -1610,7 +1610,7 @@ class Statistical * @param float $degrees degrees of freedom * @param float $tails number of tails (1 or 2) * - * @return float|string The result, or a string containing an error + * @return array|float|string The result, or a string containing an error */ public static function TDIST($value, $degrees, $tails) { @@ -1630,7 +1630,7 @@ class Statistical * @param float $probability Probability for the function * @param float $degrees degrees of freedom * - * @return float|string The result, or a string containing an error + * @return array|float|string The result, or a string containing an error */ public static function TINV($probability, $degrees) { @@ -1787,7 +1787,7 @@ class Statistical * @param float $beta Beta Parameter * @param bool $cumulative * - * @return float|string (string if result is an error) + * @return array|float|string (string if result is an error) */ public static function WEIBULL($value, $alpha, $beta, $cumulative) { diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Averages.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Averages.php index 1a627e99d..c6d84e741 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Averages.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Averages.php @@ -24,7 +24,7 @@ class Averages extends AggregateBase $aArgs = Functions::flattenArrayIndexed($args); // Return value - $returnValue = 0; + $returnValue = 0.0; $aMean = self::average(...$args); if ($aMean === Functions::DIV0()) { diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Confidence.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Confidence.php index c59c3a9ec..8f1a00180 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Confidence.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Confidence.php @@ -2,27 +2,35 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\Statistical; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception; use PhpOffice\PhpSpreadsheet\Calculation\Functions; class Confidence { + use ArrayEnabled; + /** * CONFIDENCE. * * Returns the confidence interval for a population mean * * @param mixed $alpha As a float + * Or can be an array of values * @param mixed $stdDev Standard Deviation as a float + * Or can be an array of values * @param mixed $size As an integer + * Or can be an array of values * - * @return float|string + * @return array|float|string + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function CONFIDENCE($alpha, $stdDev, $size) { - $alpha = Functions::flattenSingleValue($alpha); - $stdDev = Functions::flattenSingleValue($stdDev); - $size = Functions::flattenSingleValue($size); + if (is_array($alpha) || is_array($stdDev) || is_array($size)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $alpha, $stdDev, $size); + } try { $alpha = StatisticalValidations::validateFloat($alpha); @@ -36,6 +44,6 @@ class Confidence return Functions::NAN(); } - return Distributions\StandardNormal::inverse(1 - $alpha / 2) * $stdDev / sqrt($size); + return Functions::scalar(Distributions\StandardNormal::inverse(1 - $alpha / 2) * $stdDev / sqrt($size)); } } diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/Beta.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/Beta.php index 63e6eb4d6..0c6131dd6 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/Beta.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/Beta.php @@ -2,11 +2,14 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\Statistical\Distributions; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception; use PhpOffice\PhpSpreadsheet\Calculation\Functions; class Beta { + use ArrayEnabled; + private const MAX_ITERATIONS = 256; private const LOG_GAMMA_X_MAX_VALUE = 2.55e305; @@ -19,20 +22,28 @@ class Beta * Returns the beta distribution. * * @param mixed $value Float value at which you want to evaluate the distribution + * Or can be an array of values * @param mixed $alpha Parameter to the distribution as a float + * Or can be an array of values * @param mixed $beta Parameter to the distribution as a float + * Or can be an array of values * @param mixed $rMin as an float + * Or can be an array of values * @param mixed $rMax as an float + * Or can be an array of values * - * @return float|string + * @return array|float|string + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function distribution($value, $alpha, $beta, $rMin = 0.0, $rMax = 1.0) { - $value = Functions::flattenSingleValue($value); - $alpha = Functions::flattenSingleValue($alpha); - $beta = Functions::flattenSingleValue($beta); - $rMin = ($rMin === null) ? 0.0 : Functions::flattenSingleValue($rMin); - $rMax = ($rMax === null) ? 1.0 : Functions::flattenSingleValue($rMax); + if (is_array($value) || is_array($alpha) || is_array($beta) || is_array($rMin) || is_array($rMax)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $alpha, $beta, $rMin, $rMax); + } + + $rMin = $rMin ?? 0.0; + $rMax = $rMax ?? 1.0; try { $value = DistributionValidations::validateFloat($value); @@ -65,20 +76,28 @@ class Beta * Returns the inverse of the Beta distribution. * * @param mixed $probability Float probability at which you want to evaluate the distribution + * Or can be an array of values * @param mixed $alpha Parameter to the distribution as a float + * Or can be an array of values * @param mixed $beta Parameter to the distribution as a float + * Or can be an array of values * @param mixed $rMin Minimum value as a float + * Or can be an array of values * @param mixed $rMax Maximum value as a float + * Or can be an array of values * - * @return float|string + * @return array|float|string + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function inverse($probability, $alpha, $beta, $rMin = 0.0, $rMax = 1.0) { - $probability = Functions::flattenSingleValue($probability); - $alpha = Functions::flattenSingleValue($alpha); - $beta = Functions::flattenSingleValue($beta); - $rMin = ($rMin === null) ? 0.0 : Functions::flattenSingleValue($rMin); - $rMax = ($rMax === null) ? 1.0 : Functions::flattenSingleValue($rMax); + if (is_array($probability) || is_array($alpha) || is_array($beta) || is_array($rMin) || is_array($rMax)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $probability, $alpha, $beta, $rMin, $rMax); + } + + $rMin = $rMin ?? 0.0; + $rMax = $rMax ?? 1.0; try { $probability = DistributionValidations::validateProbability($probability); diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/Binomial.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/Binomial.php index 9631236ab..d188f2af3 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/Binomial.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/Binomial.php @@ -2,12 +2,15 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\Statistical\Distributions; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception; use PhpOffice\PhpSpreadsheet\Calculation\Functions; use PhpOffice\PhpSpreadsheet\Calculation\MathTrig\Combinations; class Binomial { + use ArrayEnabled; + /** * BINOMDIST. * @@ -18,17 +21,23 @@ class Binomial * babies born are male. * * @param mixed $value Integer number of successes in trials + * Or can be an array of values * @param mixed $trials Integer umber of trials + * Or can be an array of values * @param mixed $probability Probability of success on each trial as a float + * Or can be an array of values * @param mixed $cumulative Boolean value indicating if we want the cdf (true) or the pdf (false) + * Or can be an array of values * - * @return float|string + * @return array|float|string + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function distribution($value, $trials, $probability, $cumulative) { - $value = Functions::flattenSingleValue($value); - $trials = Functions::flattenSingleValue($trials); - $probability = Functions::flattenSingleValue($probability); + if (is_array($value) || is_array($trials) || is_array($probability) || is_array($cumulative)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $trials, $probability, $cumulative); + } try { $value = DistributionValidations::validateInt($value); @@ -58,19 +67,26 @@ class Binomial * of trials falling into a specified range. * * @param mixed $trials Integer number of trials + * Or can be an array of values * @param mixed $probability Probability of success on each trial as a float + * Or can be an array of values * @param mixed $successes The integer number of successes in trials + * Or can be an array of values * @param mixed $limit Upper limit for successes in trials as null, or an integer * If null, then this will indicate the same as the number of Successes + * Or can be an array of values * - * @return float|string + * @return array|float|string + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function range($trials, $probability, $successes, $limit = null) { - $trials = Functions::flattenSingleValue($trials); - $probability = Functions::flattenSingleValue($probability); - $successes = Functions::flattenSingleValue($successes); - $limit = ($limit === null) ? $successes : Functions::flattenSingleValue($limit); + if (is_array($trials) || is_array($probability) || is_array($successes) || is_array($limit)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $trials, $probability, $successes, $limit); + } + + $limit = $limit ?? $successes; try { $trials = DistributionValidations::validateInt($trials); @@ -107,19 +123,24 @@ class Binomial * variable. Like the binomial, trials are assumed to be independent. * * @param mixed $failures Number of Failures as an integer + * Or can be an array of values * @param mixed $successes Threshold number of Successes as an integer + * Or can be an array of values * @param mixed $probability Probability of success on each trial as a float + * Or can be an array of values * - * @return float|string The result, or a string containing an error + * @return array|float|string The result, or a string containing an error + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions * * TODO Add support for the cumulative flag not present for NEGBINOMDIST, but introduced for NEGBINOM.DIST * The cumulative default should be false to reflect the behaviour of NEGBINOMDIST */ public static function negative($failures, $successes, $probability) { - $failures = Functions::flattenSingleValue($failures); - $successes = Functions::flattenSingleValue($successes); - $probability = Functions::flattenSingleValue($probability); + if (is_array($failures) || is_array($successes) || is_array($probability)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $failures, $successes, $probability); + } try { $failures = DistributionValidations::validateInt($failures); @@ -143,22 +164,27 @@ class Binomial } /** - * CRITBINOM. + * BINOM.INV. * * Returns the smallest value for which the cumulative binomial distribution is greater * than or equal to a criterion value * * @param mixed $trials number of Bernoulli trials as an integer + * Or can be an array of values * @param mixed $probability probability of a success on each trial as a float + * Or can be an array of values * @param mixed $alpha criterion value as a float + * Or can be an array of values * - * @return int|string + * @return array|int|string + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function inverse($trials, $probability, $alpha) { - $trials = Functions::flattenSingleValue($trials); - $probability = Functions::flattenSingleValue($probability); - $alpha = Functions::flattenSingleValue($alpha); + if (is_array($trials) || is_array($probability) || is_array($alpha)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $trials, $probability, $alpha); + } try { $trials = DistributionValidations::validateInt($trials); diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/ChiSquared.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/ChiSquared.php index 5165d6397..4ccae9320 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/ChiSquared.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/ChiSquared.php @@ -2,11 +2,14 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\Statistical\Distributions; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception; use PhpOffice\PhpSpreadsheet\Calculation\Functions; class ChiSquared { + use ArrayEnabled; + private const MAX_ITERATIONS = 256; private const EPS = 2.22e-16; @@ -17,14 +20,19 @@ class ChiSquared * Returns the one-tailed probability of the chi-squared distribution. * * @param mixed $value Float value for which we want the probability + * Or can be an array of values * @param mixed $degrees Integer degrees of freedom + * Or can be an array of values * - * @return float|string + * @return array|float|string + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function distributionRightTail($value, $degrees) { - $value = Functions::flattenSingleValue($value); - $degrees = Functions::flattenSingleValue($degrees); + if (is_array($value) || is_array($degrees)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $degrees); + } try { $value = DistributionValidations::validateFloat($value); @@ -53,16 +61,21 @@ class ChiSquared * Returns the one-tailed probability of the chi-squared distribution. * * @param mixed $value Float value for which we want the probability + * Or can be an array of values * @param mixed $degrees Integer degrees of freedom + * Or can be an array of values * @param mixed $cumulative Boolean value indicating if we want the cdf (true) or the pdf (false) + * Or can be an array of values * - * @return float|string + * @return array|float|string + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function distributionLeftTail($value, $degrees, $cumulative) { - $value = Functions::flattenSingleValue($value); - $degrees = Functions::flattenSingleValue($degrees); - $cumulative = Functions::flattenSingleValue($cumulative); + if (is_array($value) || is_array($degrees) || is_array($cumulative)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $degrees, $cumulative); + } try { $value = DistributionValidations::validateFloat($value); @@ -97,14 +110,19 @@ class ChiSquared * Returns the inverse of the right-tailed probability of the chi-squared distribution. * * @param mixed $probability Float probability at which you want to evaluate the distribution + * Or can be an array of values * @param mixed $degrees Integer degrees of freedom + * Or can be an array of values * - * @return float|string + * @return array|float|string + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function inverseRightTail($probability, $degrees) { - $probability = Functions::flattenSingleValue($probability); - $degrees = Functions::flattenSingleValue($degrees); + if (is_array($probability) || is_array($degrees)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $probability, $degrees); + } try { $probability = DistributionValidations::validateProbability($probability); @@ -133,14 +151,19 @@ class ChiSquared * Returns the inverse of the left-tailed probability of the chi-squared distribution. * * @param mixed $probability Float probability at which you want to evaluate the distribution + * Or can be an array of values * @param mixed $degrees Integer degrees of freedom + * Or can be an array of values * - * @return float|string + * @return array|float|string + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function inverseLeftTail($probability, $degrees) { - $probability = Functions::flattenSingleValue($probability); - $degrees = Functions::flattenSingleValue($degrees); + if (is_array($probability) || is_array($degrees)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $probability, $degrees); + } try { $probability = DistributionValidations::validateProbability($probability); @@ -193,7 +216,7 @@ class ChiSquared $degrees = self::degrees($rows, $columns); - $result = self::distributionRightTail($result, $degrees); + $result = Functions::scalar(self::distributionRightTail($result, $degrees)); return $result; } diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/Exponential.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/Exponential.php index b3fd9460c..ca55857e7 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/Exponential.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/Exponential.php @@ -2,11 +2,14 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\Statistical\Distributions; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception; use PhpOffice\PhpSpreadsheet\Calculation\Functions; class Exponential { + use ArrayEnabled; + /** * EXPONDIST. * @@ -15,16 +18,21 @@ class Exponential * use EXPONDIST to determine the probability that the process takes at most 1 minute. * * @param mixed $value Float value for which we want the probability + * Or can be an array of values * @param mixed $lambda The parameter value as a float + * Or can be an array of values * @param mixed $cumulative Boolean value indicating if we want the cdf (true) or the pdf (false) + * Or can be an array of values * - * @return float|string + * @return array|float|string + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function distribution($value, $lambda, $cumulative) { - $value = Functions::flattenSingleValue($value); - $lambda = Functions::flattenSingleValue($lambda); - $cumulative = Functions::flattenSingleValue($cumulative); + if (is_array($value) || is_array($lambda) || is_array($cumulative)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $lambda, $cumulative); + } try { $value = DistributionValidations::validateFloat($value); diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/F.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/F.php index 54b1950d6..0fd0aab33 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/F.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/F.php @@ -2,11 +2,14 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\Statistical\Distributions; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception; use PhpOffice\PhpSpreadsheet\Calculation\Functions; class F { + use ArrayEnabled; + /** * F.DIST. * @@ -16,18 +19,23 @@ class F * if the variability in the females is different from that found in the males. * * @param mixed $value Float value for which we want the probability + * Or can be an array of values * @param mixed $u The numerator degrees of freedom as an integer + * Or can be an array of values * @param mixed $v The denominator degrees of freedom as an integer + * Or can be an array of values * @param mixed $cumulative Boolean value indicating if we want the cdf (true) or the pdf (false) + * Or can be an array of values * - * @return float|string + * @return array|float|string + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function distribution($value, $u, $v, $cumulative) { - $value = Functions::flattenSingleValue($value); - $u = Functions::flattenSingleValue($u); - $v = Functions::flattenSingleValue($v); - $cumulative = Functions::flattenSingleValue($cumulative); + if (is_array($value) || is_array($u) || is_array($v) || is_array($cumulative)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $u, $v, $cumulative); + } try { $value = DistributionValidations::validateFloat($value); diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/Fisher.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/Fisher.php index 923bf02d9..8d1b5ce6e 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/Fisher.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/Fisher.php @@ -2,11 +2,14 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\Statistical\Distributions; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception; use PhpOffice\PhpSpreadsheet\Calculation\Functions; class Fisher { + use ArrayEnabled; + /** * FISHER. * @@ -15,12 +18,17 @@ class Fisher * testing on the correlation coefficient. * * @param mixed $value Float value for which we want the probability + * Or can be an array of values * - * @return float|string + * @return array|float|string + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function distribution($value) { - $value = Functions::flattenSingleValue($value); + if (is_array($value)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $value); + } try { DistributionValidations::validateFloat($value); @@ -43,12 +51,17 @@ class Fisher * FISHERINV(y) = x. * * @param mixed $probability Float probability at which you want to evaluate the distribution + * Or can be an array of values * - * @return float|string + * @return array|float|string + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function inverse($probability) { - $probability = Functions::flattenSingleValue($probability); + if (is_array($probability)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $probability); + } try { DistributionValidations::validateFloat($probability); diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/Gamma.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/Gamma.php index 2c6ed670a..adf534287 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/Gamma.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/Gamma.php @@ -2,23 +2,31 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\Statistical\Distributions; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception; use PhpOffice\PhpSpreadsheet\Calculation\Functions; class Gamma extends GammaBase { + use ArrayEnabled; + /** * GAMMA. * * Return the gamma function value. * * @param mixed $value Float value for which we want the probability + * Or can be an array of values * - * @return float|string The result, or a string containing an error + * @return array|float|string The result, or a string containing an error + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function gamma($value) { - $value = Functions::flattenSingleValue($value); + if (is_array($value)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $value); + } try { $value = DistributionValidations::validateFloat($value); @@ -39,17 +47,23 @@ class Gamma extends GammaBase * Returns the gamma distribution. * * @param mixed $value Float Value at which you want to evaluate the distribution + * Or can be an array of values * @param mixed $a Parameter to the distribution as a float + * Or can be an array of values * @param mixed $b Parameter to the distribution as a float + * Or can be an array of values * @param mixed $cumulative Boolean value indicating if we want the cdf (true) or the pdf (false) + * Or can be an array of values * - * @return float|string + * @return array|float|string + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function distribution($value, $a, $b, $cumulative) { - $value = Functions::flattenSingleValue($value); - $a = Functions::flattenSingleValue($a); - $b = Functions::flattenSingleValue($b); + if (is_array($value) || is_array($a) || is_array($b) || is_array($cumulative)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $a, $b, $cumulative); + } try { $value = DistributionValidations::validateFloat($value); @@ -73,16 +87,21 @@ class Gamma extends GammaBase * Returns the inverse of the Gamma distribution. * * @param mixed $probability Float probability at which you want to evaluate the distribution + * Or can be an array of values * @param mixed $alpha Parameter to the distribution as a float + * Or can be an array of values * @param mixed $beta Parameter to the distribution as a float + * Or can be an array of values * - * @return float|string + * @return array|float|string + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function inverse($probability, $alpha, $beta) { - $probability = Functions::flattenSingleValue($probability); - $alpha = Functions::flattenSingleValue($alpha); - $beta = Functions::flattenSingleValue($beta); + if (is_array($probability) || is_array($alpha) || is_array($beta)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $probability, $alpha, $beta); + } try { $probability = DistributionValidations::validateProbability($probability); @@ -105,12 +124,17 @@ class Gamma extends GammaBase * Returns the natural logarithm of the gamma function. * * @param mixed $value Float Value at which you want to evaluate the distribution + * Or can be an array of values * - * @return float|string + * @return array|float|string + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function ln($value) { - $value = Functions::flattenSingleValue($value); + if (is_array($value)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $value); + } try { $value = DistributionValidations::validateFloat($value); diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/HyperGeometric.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/HyperGeometric.php index fe30c0879..bb7adf7bd 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/HyperGeometric.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/HyperGeometric.php @@ -2,12 +2,15 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\Statistical\Distributions; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception; use PhpOffice\PhpSpreadsheet\Calculation\Functions; use PhpOffice\PhpSpreadsheet\Calculation\MathTrig\Combinations; class HyperGeometric { + use ArrayEnabled; + /** * HYPGEOMDIST. * @@ -15,18 +18,32 @@ class HyperGeometric * sample successes, given the sample size, population successes, and population size. * * @param mixed $sampleSuccesses Integer number of successes in the sample + * Or can be an array of values * @param mixed $sampleNumber Integer size of the sample + * Or can be an array of values * @param mixed $populationSuccesses Integer number of successes in the population + * Or can be an array of values * @param mixed $populationNumber Integer population size + * Or can be an array of values * - * @return float|string + * @return array|float|string + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function distribution($sampleSuccesses, $sampleNumber, $populationSuccesses, $populationNumber) { - $sampleSuccesses = Functions::flattenSingleValue($sampleSuccesses); - $sampleNumber = Functions::flattenSingleValue($sampleNumber); - $populationSuccesses = Functions::flattenSingleValue($populationSuccesses); - $populationNumber = Functions::flattenSingleValue($populationNumber); + if ( + is_array($sampleSuccesses) || is_array($sampleNumber) || + is_array($populationSuccesses) || is_array($populationNumber) + ) { + return self::evaluateArrayArguments( + [self::class, __FUNCTION__], + $sampleSuccesses, + $sampleNumber, + $populationSuccesses, + $populationNumber + ); + } try { $sampleSuccesses = DistributionValidations::validateInt($sampleSuccesses); diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/LogNormal.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/LogNormal.php index e15237736..4bf2e0c5b 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/LogNormal.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/LogNormal.php @@ -2,11 +2,14 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\Statistical\Distributions; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception; use PhpOffice\PhpSpreadsheet\Calculation\Functions; class LogNormal { + use ArrayEnabled; + /** * LOGNORMDIST. * @@ -14,16 +17,21 @@ class LogNormal * with parameters mean and standard_dev. * * @param mixed $value Float value for which we want the probability + * Or can be an array of values * @param mixed $mean Mean value as a float + * Or can be an array of values * @param mixed $stdDev Standard Deviation as a float + * Or can be an array of values * - * @return float|string The result, or a string containing an error + * @return array|float|string The result, or a string containing an error + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function cumulative($value, $mean, $stdDev) { - $value = Functions::flattenSingleValue($value); - $mean = Functions::flattenSingleValue($mean); - $stdDev = Functions::flattenSingleValue($stdDev); + if (is_array($value) || is_array($mean) || is_array($stdDev)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $mean, $stdDev); + } try { $value = DistributionValidations::validateFloat($value); @@ -47,18 +55,23 @@ class LogNormal * with parameters mean and standard_dev. * * @param mixed $value Float value for which we want the probability + * Or can be an array of values * @param mixed $mean Mean value as a float + * Or can be an array of values * @param mixed $stdDev Standard Deviation as a float + * Or can be an array of values * @param mixed $cumulative Boolean value indicating if we want the cdf (true) or the pdf (false) + * Or can be an array of values * - * @return float|string The result, or a string containing an error + * @return array|float|string The result, or a string containing an error + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function distribution($value, $mean, $stdDev, $cumulative = false) { - $value = Functions::flattenSingleValue($value); - $mean = Functions::flattenSingleValue($mean); - $stdDev = Functions::flattenSingleValue($stdDev); - $cumulative = Functions::flattenSingleValue($cumulative); + if (is_array($value) || is_array($mean) || is_array($stdDev) || is_array($cumulative)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $mean, $stdDev, $cumulative); + } try { $value = DistributionValidations::validateFloat($value); @@ -87,10 +100,15 @@ class LogNormal * Returns the inverse of the lognormal cumulative distribution * * @param mixed $probability Float probability for which we want the value + * Or can be an array of values * @param mixed $mean Mean Value as a float + * Or can be an array of values * @param mixed $stdDev Standard Deviation as a float + * Or can be an array of values * - * @return float|string The result, or a string containing an error + * @return array|float|string The result, or a string containing an error + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions * * @TODO Try implementing P J Acklam's refinement algorithm for greater * accuracy if I can get my head round the mathematics @@ -98,9 +116,9 @@ class LogNormal */ public static function inverse($probability, $mean, $stdDev) { - $probability = Functions::flattenSingleValue($probability); - $mean = Functions::flattenSingleValue($mean); - $stdDev = Functions::flattenSingleValue($stdDev); + if (is_array($probability) || is_array($mean) || is_array($stdDev)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $probability, $mean, $stdDev); + } try { $probability = DistributionValidations::validateProbability($probability); diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/Normal.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/Normal.php index 4d158b8c8..f876ed6d7 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/Normal.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/Normal.php @@ -2,12 +2,15 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\Statistical\Distributions; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Engineering; use PhpOffice\PhpSpreadsheet\Calculation\Exception; use PhpOffice\PhpSpreadsheet\Calculation\Functions; class Normal { + use ArrayEnabled; + public const SQRT2PI = 2.5066282746310005024157652848110452530069867406099; /** @@ -18,17 +21,23 @@ class Normal * testing. * * @param mixed $value Float value for which we want the probability + * Or can be an array of values * @param mixed $mean Mean value as a float + * Or can be an array of values * @param mixed $stdDev Standard Deviation as a float + * Or can be an array of values * @param mixed $cumulative Boolean value indicating if we want the cdf (true) or the pdf (false) + * Or can be an array of values * - * @return float|string The result, or a string containing an error + * @return array|float|string The result, or a string containing an error + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function distribution($value, $mean, $stdDev, $cumulative) { - $value = Functions::flattenSingleValue($value); - $mean = Functions::flattenSingleValue($mean); - $stdDev = Functions::flattenSingleValue($stdDev); + if (is_array($value) || is_array($mean) || is_array($stdDev) || is_array($cumulative)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $mean, $stdDev, $cumulative); + } try { $value = DistributionValidations::validateFloat($value); @@ -56,16 +65,21 @@ class Normal * Returns the inverse of the normal cumulative distribution for the specified mean and standard deviation. * * @param mixed $probability Float probability for which we want the value + * Or can be an array of values * @param mixed $mean Mean Value as a float + * Or can be an array of values * @param mixed $stdDev Standard Deviation as a float + * Or can be an array of values * - * @return float|string The result, or a string containing an error + * @return array|float|string The result, or a string containing an error + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function inverse($probability, $mean, $stdDev) { - $probability = Functions::flattenSingleValue($probability); - $mean = Functions::flattenSingleValue($mean); - $stdDev = Functions::flattenSingleValue($stdDev); + if (is_array($probability) || is_array($mean) || is_array($stdDev)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $probability, $mean, $stdDev); + } try { $probability = DistributionValidations::validateProbability($probability); diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/Poisson.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/Poisson.php index e7252e028..484bed31f 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/Poisson.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/Poisson.php @@ -2,12 +2,15 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\Statistical\Distributions; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception; use PhpOffice\PhpSpreadsheet\Calculation\Functions; use PhpOffice\PhpSpreadsheet\Calculation\MathTrig; class Poisson { + use ArrayEnabled; + /** * POISSON. * @@ -16,15 +19,21 @@ class Poisson * cars arriving at a toll plaza in 1 minute. * * @param mixed $value Float value for which we want the probability + * Or can be an array of values * @param mixed $mean Mean value as a float + * Or can be an array of values * @param mixed $cumulative Boolean value indicating if we want the cdf (true) or the pdf (false) + * Or can be an array of values * - * @return float|string The result, or a string containing an error + * @return array|float|string The result, or a string containing an error + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function distribution($value, $mean, $cumulative) { - $value = Functions::flattenSingleValue($value); - $mean = Functions::flattenSingleValue($mean); + if (is_array($value) || is_array($mean) || is_array($cumulative)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $mean, $cumulative); + } try { $value = DistributionValidations::validateFloat($value); diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/StandardNormal.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/StandardNormal.php index d10f02a5f..575add8a5 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/StandardNormal.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/StandardNormal.php @@ -2,12 +2,15 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\Statistical\Distributions; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Functions; use PhpOffice\PhpSpreadsheet\Calculation\Statistical\Averages; use PhpOffice\PhpSpreadsheet\Calculation\Statistical\StandardDeviations; class StandardNormal { + use ArrayEnabled; + /** * NORMSDIST. * @@ -15,9 +18,16 @@ class StandardNormal * a mean of 0 (zero) and a standard deviation of one. Use this function in place of a * table of standard normal curve areas. * - * @param mixed $value Float value for which we want the probability + * NOTE: We don't need to check for arrays to array-enable this function, because that is already + * handled by the logic in Normal::distribution() + * All we need to do is pass the value through as scalar or as array. * - * @return float|string The result, or a string containing an error + * @param mixed $value Float value for which we want the probability + * Or can be an array of values + * + * @return array|float|string The result, or a string containing an error + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function cumulative($value) { @@ -31,10 +41,18 @@ class StandardNormal * a mean of 0 (zero) and a standard deviation of one. Use this function in place of a * table of standard normal curve areas. * - * @param mixed $value Float value for which we want the probability - * @param mixed $cumulative Boolean value indicating if we want the cdf (true) or the pdf (false) + * NOTE: We don't need to check for arrays to array-enable this function, because that is already + * handled by the logic in Normal::distribution() + * All we need to do is pass the value and cumulative through as scalar or as array. * - * @return float|string The result, or a string containing an error + * @param mixed $value Float value for which we want the probability + * Or can be an array of values + * @param mixed $cumulative Boolean value indicating if we want the cdf (true) or the pdf (false) + * Or can be an array of values + * + * @return array|float|string The result, or a string containing an error + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function distribution($value, $cumulative) { @@ -46,9 +64,16 @@ class StandardNormal * * Returns the inverse of the standard normal cumulative distribution * - * @param mixed $value Float probability for which we want the value + * @param mixed $value float probability for which we want the value + * Or can be an array of values * - * @return float|string The result, or a string containing an error + * NOTE: We don't need to check for arrays to array-enable this function, because that is already + * handled by the logic in Normal::inverse() + * All we need to do is pass the value through as scalar or as array + * + * @return array|float|string The result, or a string containing an error + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function inverse($value) { @@ -62,12 +87,18 @@ class StandardNormal * the mean and z standard deviations from the mean. * * @param mixed $value + * Or can be an array of values * - * @return float|string The result, or a string containing an error + * @return array|float|string The result, or a string containing an error + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function gauss($value) { - $value = Functions::flattenSingleValue($value); + if (is_array($value)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $value); + } + if (!is_numeric($value)) { return Functions::VALUE(); } diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/StudentT.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/StudentT.php index 45d590dd6..27539d622 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/StudentT.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/StudentT.php @@ -2,11 +2,14 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\Statistical\Distributions; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception; use PhpOffice\PhpSpreadsheet\Calculation\Functions; class StudentT { + use ArrayEnabled; + private const MAX_ITERATIONS = 256; /** @@ -15,16 +18,21 @@ class StudentT * Returns the probability of Student's T distribution. * * @param mixed $value Float value for the distribution + * Or can be an array of values * @param mixed $degrees Integer value for degrees of freedom + * Or can be an array of values * @param mixed $tails Integer value for the number of tails (1 or 2) + * Or can be an array of values * - * @return float|string The result, or a string containing an error + * @return array|float|string The result, or a string containing an error + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function distribution($value, $degrees, $tails) { - $value = Functions::flattenSingleValue($value); - $degrees = Functions::flattenSingleValue($degrees); - $tails = Functions::flattenSingleValue($tails); + if (is_array($value) || is_array($degrees) || is_array($tails)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $degrees, $tails); + } try { $value = DistributionValidations::validateFloat($value); @@ -47,14 +55,19 @@ class StudentT * Returns the one-tailed probability of the chi-squared distribution. * * @param mixed $probability Float probability for the function + * Or can be an array of values * @param mixed $degrees Integer value for degrees of freedom + * Or can be an array of values * - * @return float|string The result, or a string containing an error + * @return array|float|string The result, or a string containing an error + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function inverse($probability, $degrees) { - $probability = Functions::flattenSingleValue($probability); - $degrees = Functions::flattenSingleValue($degrees); + if (is_array($probability) || is_array($degrees)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $probability, $degrees); + } try { $probability = DistributionValidations::validateProbability($probability); diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/Weibull.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/Weibull.php index ecec8a856..053a27edf 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/Weibull.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/Weibull.php @@ -2,11 +2,14 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\Statistical\Distributions; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception; use PhpOffice\PhpSpreadsheet\Calculation\Functions; class Weibull { + use ArrayEnabled; + /** * WEIBULL. * @@ -14,18 +17,23 @@ class Weibull * analysis, such as calculating a device's mean time to failure. * * @param mixed $value Float value for the distribution + * Or can be an array of values * @param mixed $alpha Float alpha Parameter + * Or can be an array of values * @param mixed $beta Float beta Parameter + * Or can be an array of values * @param mixed $cumulative Boolean value indicating if we want the cdf (true) or the pdf (false) + * Or can be an array of values * - * @return float|string (string if result is an error) + * @return array|float|string (string if result is an error) + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function distribution($value, $alpha, $beta, $cumulative) { - $value = Functions::flattenSingleValue($value); - $alpha = Functions::flattenSingleValue($alpha); - $beta = Functions::flattenSingleValue($beta); - $cumulative = Functions::flattenSingleValue($cumulative); + if (is_array($value) || is_array($alpha) || is_array($beta) || is_array($cumulative)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $alpha, $beta, $cumulative); + } try { $value = DistributionValidations::validateFloat($value); diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Permutations.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Permutations.php index 272a8a53d..7696878e8 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Permutations.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Permutations.php @@ -2,6 +2,7 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\Statistical; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception; use PhpOffice\PhpSpreadsheet\Calculation\Functions; use PhpOffice\PhpSpreadsheet\Calculation\MathTrig; @@ -9,6 +10,8 @@ use PhpOffice\PhpSpreadsheet\Shared\IntOrFloat; class Permutations { + use ArrayEnabled; + /** * PERMUT. * @@ -19,14 +22,19 @@ class Permutations * for lottery-style probability calculations. * * @param mixed $numObjs Integer number of different objects + * Or can be an array of values * @param mixed $numInSet Integer number of objects in each permutation + * Or can be an array of values * - * @return float|int|string Number of permutations, or a string containing an error + * @return array|float|int|string Number of permutations, or a string containing an error + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function PERMUT($numObjs, $numInSet) { - $numObjs = Functions::flattenSingleValue($numObjs); - $numInSet = Functions::flattenSingleValue($numInSet); + if (is_array($numObjs) || is_array($numInSet)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $numObjs, $numInSet); + } try { $numObjs = StatisticalValidations::validateInt($numObjs); @@ -50,14 +58,19 @@ class Permutations * that can be selected from the total objects. * * @param mixed $numObjs Integer number of different objects + * Or can be an array of values * @param mixed $numInSet Integer number of objects in each permutation + * Or can be an array of values * - * @return float|int|string Number of permutations, or a string containing an error + * @return array|float|int|string Number of permutations, or a string containing an error + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function PERMUTATIONA($numObjs, $numInSet) { - $numObjs = Functions::flattenSingleValue($numObjs); - $numInSet = Functions::flattenSingleValue($numInSet); + if (is_array($numObjs) || is_array($numInSet)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $numObjs, $numInSet); + } try { $numObjs = StatisticalValidations::validateInt($numObjs); diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Standardize.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Standardize.php index 2f3c58e72..13240cc25 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Standardize.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Standardize.php @@ -2,27 +2,35 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\Statistical; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception; use PhpOffice\PhpSpreadsheet\Calculation\Functions; class Standardize extends StatisticalValidations { + use ArrayEnabled; + /** * STANDARDIZE. * * Returns a normalized value from a distribution characterized by mean and standard_dev. * - * @param float $value Value to normalize - * @param float $mean Mean Value - * @param float $stdDev Standard Deviation + * @param array|float $value Value to normalize + * Or can be an array of values + * @param array|float $mean Mean Value + * Or can be an array of values + * @param array|float $stdDev Standard Deviation + * Or can be an array of values * - * @return float|string Standardized value, or a string containing an error + * @return array|float|string Standardized value, or a string containing an error + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function execute($value, $mean, $stdDev) { - $value = Functions::flattenSingleValue($value); - $mean = Functions::flattenSingleValue($mean); - $stdDev = Functions::flattenSingleValue($stdDev); + if (is_array($value) || is_array($mean) || is_array($stdDev)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $mean, $stdDev); + } try { $value = self::validateFloat($value); diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Trends.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Trends.php index 93724a8c1..a43926faa 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Trends.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Trends.php @@ -2,12 +2,15 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\Statistical; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception; use PhpOffice\PhpSpreadsheet\Calculation\Functions; use PhpOffice\PhpSpreadsheet\Shared\Trend\Trend; class Trends { + use ArrayEnabled; + private static function filterTrendValues(array &$array1, array &$array2): void { foreach ($array1 as $key => $value) { @@ -108,14 +111,19 @@ class Trends * The predicted value is a y-value for a given x-value. * * @param mixed $xValue Float value of X for which we want to find Y + * Or can be an array of values * @param mixed $yValues array of mixed Data Series Y * @param mixed $xValues of mixed Data Series X * - * @return bool|float|string + * @return array|bool|float|string + * If an array of numbers is passed as an argument, then the returned result will also be an array + * with the same dimensions */ public static function FORECAST($xValue, $yValues, $xValues) { - $xValue = Functions::flattenSingleValue($xValue); + if (is_array($xValue)) { + return self::evaluateArrayArgumentsSubset([self::class, __FUNCTION__], 1, $xValue, $yValues, $xValues); + } try { $xValue = StatisticalValidations::validateFloat($xValue); diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData.php index 0bde3b7fe..6757a8d87 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData.php @@ -18,7 +18,7 @@ class TextData * * @param string $character Value * - * @return string + * @return array|string */ public static function CHARACTER($character) { @@ -34,7 +34,7 @@ class TextData * * @param mixed $stringValue Value to check * - * @return string + * @return null|array|string */ public static function TRIMNONPRINTABLE($stringValue = '') { @@ -50,7 +50,7 @@ class TextData * * @param mixed $stringValue Value to check * - * @return string + * @return array|string */ public static function TRIMSPACES($stringValue = '') { @@ -64,9 +64,9 @@ class TextData * * @see Use the code() method in the TextData\CharacterConvert class instead * - * @param string $characters Value + * @param array|string $characters Value * - * @return int|string A string if arguments are invalid + * @return array|int|string A string if arguments are invalid */ public static function ASCIICODE($characters) { @@ -102,7 +102,7 @@ class TextData * If decimals is negative, number is rounded to the left of the decimal point. * If you omit decimals, it is assumed to be 2 * - * @return string + * @return array|string */ public static function DOLLAR($value = 0, $decimals = 2) { @@ -110,17 +110,17 @@ class TextData } /** - * SEARCHSENSITIVE. + * FIND. * * @Deprecated 1.18.0 * * @see Use the sensitive() method in the TextData\Search class instead * - * @param string $needle The string to look for - * @param string $haystack The string in which to look - * @param int $offset Offset within $haystack + * @param array|string $needle The string to look for + * @param array|string $haystack The string in which to look + * @param array|int $offset Offset within $haystack * - * @return string + * @return array|int|string */ public static function SEARCHSENSITIVE($needle, $haystack, $offset = 1) { @@ -128,17 +128,17 @@ class TextData } /** - * SEARCHINSENSITIVE. + * SEARCH. * * @Deprecated 1.18.0 * * @see Use the insensitive() method in the TextData\Search class instead * - * @param string $needle The string to look for - * @param string $haystack The string in which to look - * @param int $offset Offset within $haystack + * @param array|string $needle The string to look for + * @param array|string $haystack The string in which to look + * @param array|int $offset Offset within $haystack * - * @return string + * @return array|int|string */ public static function SEARCHINSENSITIVE($needle, $haystack, $offset = 1) { @@ -156,7 +156,7 @@ class TextData * @param int $decimals * @param bool $no_commas * - * @return string + * @return array|string */ public static function FIXEDFORMAT($value, $decimals = 2, $no_commas = false) { @@ -170,10 +170,10 @@ class TextData * * @see Use the left() method in the TextData\Extract class instead * - * @param string $value Value - * @param int $chars Number of characters + * @param array|string $value Value + * @param array|int $chars Number of characters * - * @return string + * @return array|string */ public static function LEFT($value = '', $chars = 1) { @@ -187,11 +187,11 @@ class TextData * * @see Use the mid() method in the TextData\Extract class instead * - * @param string $value Value - * @param int $start Start character - * @param int $chars Number of characters + * @param array|string $value Value + * @param array|int $start Start character + * @param array|int $chars Number of characters * - * @return string + * @return array|string */ public static function MID($value = '', $start = 1, $chars = null) { @@ -205,10 +205,10 @@ class TextData * * @see Use the right() method in the TextData\Extract class instead * - * @param string $value Value - * @param int $chars Number of characters + * @param array|string $value Value + * @param array|int $chars Number of characters * - * @return string + * @return array|string */ public static function RIGHT($value = '', $chars = 1) { @@ -224,7 +224,7 @@ class TextData * * @param string $value Value * - * @return int + * @return array|int */ public static function STRINGLENGTH($value = '') { @@ -234,15 +234,15 @@ class TextData /** * LOWERCASE. * - * Converts a string value to upper case. + * Converts a string value to lower case. * * @Deprecated 1.18.0 * * @see Use the lower() method in the TextData\CaseConvert class instead * - * @param string $mixedCaseString + * @param array|string $mixedCaseString * - * @return string + * @return array|string */ public static function LOWERCASE($mixedCaseString) { @@ -260,7 +260,7 @@ class TextData * * @param string $mixedCaseString * - * @return string + * @return array|string */ public static function UPPERCASE($mixedCaseString) { @@ -270,15 +270,15 @@ class TextData /** * PROPERCASE. * - * Converts a string value to upper case. + * Converts a string value to proper/title case. * * @Deprecated 1.18.0 * * @see Use the proper() method in the TextData\CaseConvert class instead * - * @param string $mixedCaseString + * @param array|string $mixedCaseString * - * @return string + * @return array|string */ public static function PROPERCASE($mixedCaseString) { @@ -297,7 +297,7 @@ class TextData * @param int $chars Number of characters * @param string $newText String to replace in defined position * - * @return string + * @return array|string */ public static function REPLACE($oldText, $start, $chars, $newText) { @@ -316,7 +316,7 @@ class TextData * @param string $toText To Value * @param int $instance Instance Number * - * @return string + * @return array|string */ public static function SUBSTITUTE($text = '', $fromText = '', $toText = '', $instance = 0) { @@ -332,7 +332,7 @@ class TextData * * @param mixed $testValue Value to check * - * @return null|string + * @return null|array|string */ public static function RETURNSTRING($testValue = '') { @@ -349,7 +349,7 @@ class TextData * @param mixed $value Value to check * @param string $format Format mask to use * - * @return string + * @return array|string */ public static function TEXTFORMAT($value, $format) { @@ -365,7 +365,7 @@ class TextData * * @param mixed $value Value to check * - * @return DateTimeInterface|float|int|string A string if arguments are invalid + * @return array|DateTimeInterface|float|int|string A string if arguments are invalid */ public static function VALUE($value = '') { @@ -383,7 +383,7 @@ class TextData * @param string $decimalSeparator decimal separator, defaults to locale defined value * @param string $groupSeparator group/thosands separator, defaults to locale defined value * - * @return float|string + * @return array|float|string */ public static function NUMBERVALUE($value = '', $decimalSeparator = null, $groupSeparator = null) { @@ -402,7 +402,7 @@ class TextData * @param mixed $value1 * @param mixed $value2 * - * @return bool + * @return array|bool */ public static function EXACT($value1, $value2) { @@ -420,7 +420,7 @@ class TextData * @param mixed $ignoreEmpty * @param mixed $args * - * @return string + * @return array|string */ public static function TEXTJOIN($delimiter, $ignoreEmpty, ...$args) { @@ -436,10 +436,10 @@ class TextData * * @see Use the builtinREPT() method in the TextData\Concatenate class instead * - * @param string $str Should be numeric + * @param array|string $str Should be numeric * @param mixed $number Should be int * - * @return string + * @return array|string */ public static function builtinREPT($str, $number) { diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData/CaseConvert.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData/CaseConvert.php index 664cc2d88..f1aea1694 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData/CaseConvert.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData/CaseConvert.php @@ -2,21 +2,31 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\TextData; -use PhpOffice\PhpSpreadsheet\Calculation\Functions; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Shared\StringHelper; class CaseConvert { + use ArrayEnabled; + /** * LOWERCASE. * * Converts a string value to upper case. * * @param mixed $mixedCaseValue The string value to convert to lower case + * Or can be an array of values + * + * @return array|string + * If an array of values is passed as the argument, then the returned result will also be an array + * with the same dimensions */ - public static function lower($mixedCaseValue): string + public static function lower($mixedCaseValue) { - $mixedCaseValue = Functions::flattenSingleValue($mixedCaseValue); + if (is_array($mixedCaseValue)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $mixedCaseValue); + } + $mixedCaseValue = Helpers::extractString($mixedCaseValue); return StringHelper::strToLower($mixedCaseValue); @@ -28,10 +38,18 @@ class CaseConvert * Converts a string value to upper case. * * @param mixed $mixedCaseValue The string value to convert to upper case + * Or can be an array of values + * + * @return array|string + * If an array of values is passed as the argument, then the returned result will also be an array + * with the same dimensions */ - public static function upper($mixedCaseValue): string + public static function upper($mixedCaseValue) { - $mixedCaseValue = Functions::flattenSingleValue($mixedCaseValue); + if (is_array($mixedCaseValue)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $mixedCaseValue); + } + $mixedCaseValue = Helpers::extractString($mixedCaseValue); return StringHelper::strToUpper($mixedCaseValue); @@ -43,10 +61,18 @@ class CaseConvert * Converts a string value to proper or title case. * * @param mixed $mixedCaseValue The string value to convert to title case + * Or can be an array of values + * + * @return array|string + * If an array of values is passed as the argument, then the returned result will also be an array + * with the same dimensions */ - public static function proper($mixedCaseValue): string + public static function proper($mixedCaseValue) { - $mixedCaseValue = Functions::flattenSingleValue($mixedCaseValue); + if (is_array($mixedCaseValue)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $mixedCaseValue); + } + $mixedCaseValue = Helpers::extractString($mixedCaseValue); return StringHelper::strToTitle($mixedCaseValue); diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData/CharacterConvert.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData/CharacterConvert.php index 0aca57e6c..714d789e5 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData/CharacterConvert.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData/CharacterConvert.php @@ -2,17 +2,29 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\TextData; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Functions; class CharacterConvert { + use ArrayEnabled; + /** * CHAR. * * @param mixed $character Integer Value to convert to its character representation + * Or can be an array of values + * + * @return array|string The character string + * If an array of values is passed as the argument, then the returned result will also be an array + * with the same dimensions */ - public static function character($character): string + public static function character($character) { + if (is_array($character)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $character); + } + $character = Helpers::validateInt($character); $min = Functions::getCompatibilityMode() === Functions::COMPATIBILITY_OPENOFFICE ? 0 : 1; if ($character < $min || $character > 255) { @@ -27,11 +39,18 @@ class CharacterConvert * CODE. * * @param mixed $characters String character to convert to its ASCII value + * Or can be an array of values * - * @return int|string A string if arguments are invalid + * @return array|int|string A string if arguments are invalid + * If an array of values is passed as the argument, then the returned result will also be an array + * with the same dimensions */ public static function code($characters) { + if (is_array($characters)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $characters); + } + $characters = Helpers::extractString($characters); if ($characters === '') { return Functions::VALUE(); diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData/Concatenate.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData/Concatenate.php index d53fc8228..f23996a6a 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData/Concatenate.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData/Concatenate.php @@ -2,10 +2,13 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\TextData; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Functions; class Concatenate { + use ArrayEnabled; + /** * CONCATENATE. * @@ -28,14 +31,28 @@ class Concatenate /** * TEXTJOIN. * - * @param mixed $delimiter - * @param mixed $ignoreEmpty - * @param mixed $args + * @param mixed $delimiter The delimter to use between the joined arguments + * Or can be an array of values + * @param mixed $ignoreEmpty true/false Flag indicating whether empty arguments should be skipped + * Or can be an array of values + * @param mixed $args The values to join + * + * @return array|string The joined string + * If an array of values is passed for the $delimiter or $ignoreEmpty arguments, then the returned result + * will also be an array with matching dimensions */ - public static function TEXTJOIN($delimiter, $ignoreEmpty, ...$args): string + public static function TEXTJOIN($delimiter, $ignoreEmpty, ...$args) { - $delimiter = Functions::flattenSingleValue($delimiter); - $ignoreEmpty = Functions::flattenSingleValue($ignoreEmpty); + if (is_array($delimiter) || is_array($ignoreEmpty)) { + return self::evaluateArrayArgumentsSubset( + [self::class, __FUNCTION__], + 2, + $delimiter, + $ignoreEmpty, + ...$args + ); + } + // Loop through arguments $aArgs = Functions::flattenArray($args); foreach ($aArgs as $key => &$arg) { @@ -55,11 +72,20 @@ class Concatenate * Returns the result of builtin function round after validating args. * * @param mixed $stringValue The value to repeat + * Or can be an array of values * @param mixed $repeatCount The number of times the string value should be repeated + * Or can be an array of values + * + * @return array|string The repeated string + * If an array of values is passed for the $stringValue or $repeatCount arguments, then the returned result + * will also be an array with matching dimensions */ - public static function builtinREPT($stringValue, $repeatCount): string + public static function builtinREPT($stringValue, $repeatCount) { - $repeatCount = Functions::flattenSingleValue($repeatCount); + if (is_array($stringValue) || is_array($repeatCount)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $stringValue, $repeatCount); + } + $stringValue = Helpers::extractString($stringValue); if (!is_numeric($repeatCount) || $repeatCount < 0) { diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData/Extract.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData/Extract.php index 7f18e0c6e..d29f80cab 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData/Extract.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData/Extract.php @@ -2,18 +2,31 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\TextData; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception as CalcExp; class Extract { + use ArrayEnabled; + /** * LEFT. * * @param mixed $value String value from which to extract characters + * Or can be an array of values * @param mixed $chars The number of characters to extract (as an integer) + * Or can be an array of values + * + * @return array|string The joined string + * If an array of values is passed for the $value or $chars arguments, then the returned result + * will also be an array with matching dimensions */ - public static function left($value, $chars = 1): string + public static function left($value, $chars = 1) { + if (is_array($value) || is_array($chars)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $chars); + } + try { $value = Helpers::extractString($value); $chars = Helpers::extractInt($chars, 0, 1); @@ -28,11 +41,22 @@ class Extract * MID. * * @param mixed $value String value from which to extract characters + * Or can be an array of values * @param mixed $start Integer offset of the first character that we want to extract + * Or can be an array of values * @param mixed $chars The number of characters to extract (as an integer) + * Or can be an array of values + * + * @return array|string The joined string + * If an array of values is passed for the $value, $start or $chars arguments, then the returned result + * will also be an array with matching dimensions */ - public static function mid($value, $start, $chars): string + public static function mid($value, $start, $chars) { + if (is_array($value) || is_array($start) || is_array($chars)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $start, $chars); + } + try { $value = Helpers::extractString($value); $start = Helpers::extractInt($start, 1); @@ -48,10 +72,20 @@ class Extract * RIGHT. * * @param mixed $value String value from which to extract characters + * Or can be an array of values * @param mixed $chars The number of characters to extract (as an integer) + * Or can be an array of values + * + * @return array|string The joined string + * If an array of values is passed for the $value or $chars arguments, then the returned result + * will also be an array with matching dimensions */ - public static function right($value, $chars = 1): string + public static function right($value, $chars = 1) { + if (is_array($value) || is_array($chars)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $chars); + } + try { $value = Helpers::extractString($value); $chars = Helpers::extractInt($chars, 0, 1); diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData/Format.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData/Format.php index 3286de0cb..b4b634fbf 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData/Format.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData/Format.php @@ -3,6 +3,7 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\TextData; use DateTimeInterface; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\DateTimeExcel; use PhpOffice\PhpSpreadsheet\Calculation\Exception as CalcExp; use PhpOffice\PhpSpreadsheet\Calculation\Functions; @@ -13,6 +14,8 @@ use PhpOffice\PhpSpreadsheet\Style\NumberFormat; class Format { + use ArrayEnabled; + /** * DOLLAR. * @@ -20,12 +23,22 @@ class Format * The format used is $#,##0.00_);($#,##0.00).. * * @param mixed $value The value to format + * Or can be an array of values * @param mixed $decimals The number of digits to display to the right of the decimal point (as an integer). * If decimals is negative, number is rounded to the left of the decimal point. * If you omit decimals, it is assumed to be 2 + * Or can be an array of values + * + * @return array|string + * If an array of values is passed for either of the arguments, then the returned result + * will also be an array with matching dimensions */ - public static function DOLLAR($value = 0, $decimals = 2): string + public static function DOLLAR($value = 0, $decimals = 2) { + if (is_array($value) || is_array($decimals)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $decimals); + } + try { $value = Helpers::extractFloat($value); $decimals = Helpers::extractInt($decimals, -100, 0, true); @@ -52,15 +65,25 @@ class Format * FIXED. * * @param mixed $value The value to format + * Or can be an array of values * @param mixed $decimals Integer value for the number of decimal places that should be formatted + * Or can be an array of values * @param mixed $noCommas Boolean value indicating whether the value should have thousands separators or not + * Or can be an array of values + * + * @return array|string + * If an array of values is passed for either of the arguments, then the returned result + * will also be an array with matching dimensions */ - public static function FIXEDFORMAT($value, $decimals = 2, $noCommas = false): string + public static function FIXEDFORMAT($value, $decimals = 2, $noCommas = false) { + if (is_array($value) || is_array($decimals) || is_array($noCommas)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $decimals, $noCommas); + } + try { $value = Helpers::extractFloat($value); $decimals = Helpers::extractInt($decimals, -100, 0, true); - $noCommas = Functions::flattenSingleValue($noCommas); } catch (CalcExp $e) { return $e->getMessage(); } @@ -85,10 +108,20 @@ class Format * TEXT. * * @param mixed $value The value to format + * Or can be an array of values * @param mixed $format A string with the Format mask that should be used + * Or can be an array of values + * + * @return array|string + * If an array of values is passed for either of the arguments, then the returned result + * will also be an array with matching dimensions */ - public static function TEXTFORMAT($value, $format): string + public static function TEXTFORMAT($value, $format) { + if (is_array($value) || is_array($format)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $format); + } + $value = Helpers::extractString($value); $format = Helpers::extractString($format); @@ -106,7 +139,7 @@ class Format */ private static function convertValue($value) { - $value = ($value === null) ? 0 : Functions::flattenSingleValue($value); + $value = $value ?? 0; if (is_bool($value)) { if (Functions::getCompatibilityMode() === Functions::COMPATIBILITY_OPENOFFICE) { $value = (int) $value; @@ -122,11 +155,18 @@ class Format * VALUE. * * @param mixed $value Value to check + * Or can be an array of values * - * @return DateTimeInterface|float|int|string A string if arguments are invalid + * @return array|DateTimeInterface|float|int|string A string if arguments are invalid + * If an array of values is passed for the argument, then the returned result + * will also be an array with matching dimensions */ public static function VALUE($value = '') { + if (is_array($value)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $value); + } + try { $value = self::convertValue($value); } catch (CalcExp $e) { @@ -146,14 +186,14 @@ class Format Functions::setReturnDateType(Functions::RETURNDATE_EXCEL); if (strpos($value, ':') !== false) { - $timeValue = DateTimeExcel\TimeValue::fromString($value); + $timeValue = Functions::scalar(DateTimeExcel\TimeValue::fromString($value)); if ($timeValue !== Functions::VALUE()) { Functions::setReturnDateType($dateSetting); return $timeValue; } } - $dateValue = DateTimeExcel\DateValue::fromString($value); + $dateValue = Functions::scalar(DateTimeExcel\DateValue::fromString($value)); if ($dateValue !== Functions::VALUE()) { Functions::setReturnDateType($dateSetting); @@ -172,8 +212,6 @@ class Format */ private static function getDecimalSeparator($decimalSeparator): string { - $decimalSeparator = Functions::flattenSingleValue($decimalSeparator); - return empty($decimalSeparator) ? StringHelper::getDecimalSeparator() : (string) $decimalSeparator; } @@ -182,8 +220,6 @@ class Format */ private static function getGroupSeparator($groupSeparator): string { - $groupSeparator = Functions::flattenSingleValue($groupSeparator); - return empty($groupSeparator) ? StringHelper::getThousandsSeparator() : (string) $groupSeparator; } @@ -191,13 +227,20 @@ class Format * NUMBERVALUE. * * @param mixed $value The value to format + * Or can be an array of values * @param mixed $decimalSeparator A string with the decimal separator to use, defaults to locale defined value + * Or can be an array of values * @param mixed $groupSeparator A string with the group/thousands separator to use, defaults to locale defined value + * Or can be an array of values * - * @return float|string + * @return array|float|string */ public static function NUMBERVALUE($value = '', $decimalSeparator = null, $groupSeparator = null) { + if (is_array($value) || is_array($decimalSeparator) || is_array($groupSeparator)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $decimalSeparator, $groupSeparator); + } + try { $value = self::convertValue($value); $decimalSeparator = self::getDecimalSeparator($decimalSeparator); diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData/Helpers.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData/Helpers.php index 423b6d3f9..86c405abf 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData/Helpers.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData/Helpers.php @@ -22,7 +22,6 @@ class Helpers */ public static function extractString($value): string { - $value = Functions::flattenSingleValue($value); if (is_bool($value)) { return self::convertBooleanValue($value); } @@ -35,7 +34,6 @@ class Helpers */ public static function extractInt($value, int $minValue, int $gnumericNull = 0, bool $ooBoolOk = false): int { - $value = Functions::flattenSingleValue($value); if ($value === null) { // usually 0, but sometimes 1 for Gnumeric $value = (Functions::getCompatibilityMode() === Functions::COMPATIBILITY_GNUMERIC) ? $gnumericNull : 0; @@ -59,7 +57,6 @@ class Helpers */ public static function extractFloat($value): float { - $value = Functions::flattenSingleValue($value); if ($value === null) { $value = 0.0; } @@ -78,7 +75,6 @@ class Helpers */ public static function validateInt($value): int { - $value = Functions::flattenSingleValue($value); if ($value === null) { $value = 0; } elseif (is_bool($value)) { diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData/Replace.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData/Replace.php index 36c13590e..c3290a2a6 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData/Replace.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData/Replace.php @@ -2,21 +2,36 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\TextData; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception as CalcExp; use PhpOffice\PhpSpreadsheet\Calculation\Functions; class Replace { + use ArrayEnabled; + /** * REPLACE. * * @param mixed $oldText The text string value to modify + * Or can be an array of values * @param mixed $start Integer offset for start character of the replacement + * Or can be an array of values * @param mixed $chars Integer number of characters to replace from the start offset + * Or can be an array of values * @param mixed $newText String to replace in the defined position + * Or can be an array of values + * + * @return array|string + * If an array of values is passed for either of the arguments, then the returned result + * will also be an array with matching dimensions */ - public static function replace($oldText, $start, $chars, $newText): string + public static function replace($oldText, $start, $chars, $newText) { + if (is_array($oldText) || is_array($start) || is_array($chars) || is_array($newText)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $oldText, $start, $chars, $newText); + } + try { $start = Helpers::extractInt($start, 1, 0, true); $chars = Helpers::extractInt($chars, 0, 0, true); @@ -36,17 +51,28 @@ class Replace * SUBSTITUTE. * * @param mixed $text The text string value to modify + * Or can be an array of values * @param mixed $fromText The string value that we want to replace in $text + * Or can be an array of values * @param mixed $toText The string value that we want to replace with in $text + * Or can be an array of values * @param mixed $instance Integer instance Number for the occurrence of frmText to change + * Or can be an array of values + * + * @return array|string + * If an array of values is passed for either of the arguments, then the returned result + * will also be an array with matching dimensions */ - public static function substitute($text = '', $fromText = '', $toText = '', $instance = null): string + public static function substitute($text = '', $fromText = '', $toText = '', $instance = null) { + if (is_array($text) || is_array($fromText) || is_array($toText) || is_array($instance)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $text, $fromText, $toText, $instance); + } + try { $text = Helpers::extractString($text); $fromText = Helpers::extractString($fromText); $toText = Helpers::extractString($toText); - $instance = Functions::flattenSingleValue($instance); if ($instance === null) { return str_replace($fromText, $toText, $text); } @@ -61,6 +87,14 @@ class Replace return $e->getMessage(); } + return self::executeSubstitution($text, $fromText, $toText, $instance); + } + + /** + * @return string + */ + private static function executeSubstitution(string $text, string $fromText, string $toText, int $instance) + { $pos = -1; while ($instance > 0) { $pos = mb_strpos($text, $fromText, $pos + 1, 'UTF-8'); @@ -71,7 +105,7 @@ class Replace } if ($pos !== false) { - return self::REPLACE($text, ++$pos, mb_strlen($fromText, 'UTF-8'), $toText); + return Functions::scalar(self::REPLACE($text, ++$pos, mb_strlen($fromText, 'UTF-8'), $toText)); } return $text; diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData/Search.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData/Search.php index c9eed2e5a..b6a723802 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData/Search.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData/Search.php @@ -2,23 +2,35 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\TextData; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception as CalcExp; use PhpOffice\PhpSpreadsheet\Calculation\Functions; use PhpOffice\PhpSpreadsheet\Shared\StringHelper; class Search { + use ArrayEnabled; + /** * FIND (case sensitive search). * * @param mixed $needle The string to look for + * Or can be an array of values * @param mixed $haystack The string in which to look + * Or can be an array of values * @param mixed $offset Integer offset within $haystack to start searching from + * Or can be an array of values * - * @return int|string + * @return array|int|string The offset where the first occurrence of needle was found in the haystack + * If an array of values is passed for the $value or $chars arguments, then the returned result + * will also be an array with matching dimensions */ public static function sensitive($needle, $haystack, $offset = 1) { + if (is_array($needle) || is_array($haystack) || is_array($offset)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $needle, $haystack, $offset); + } + try { $needle = Helpers::extractString($needle); $haystack = Helpers::extractString($haystack); @@ -45,13 +57,22 @@ class Search * SEARCH (case insensitive search). * * @param mixed $needle The string to look for + * Or can be an array of values * @param mixed $haystack The string in which to look + * Or can be an array of values * @param mixed $offset Integer offset within $haystack to start searching from + * Or can be an array of values * - * @return int|string + * @return array|int|string The offset where the first occurrence of needle was found in the haystack + * If an array of values is passed for the $value or $chars arguments, then the returned result + * will also be an array with matching dimensions */ public static function insensitive($needle, $haystack, $offset = 1) { + if (is_array($needle) || is_array($haystack) || is_array($offset)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $needle, $haystack, $offset); + } + try { $needle = Helpers::extractString($needle); $haystack = Helpers::extractString($haystack); diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData/Text.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData/Text.php index 6f8253eab..490c43c20 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData/Text.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData/Text.php @@ -2,17 +2,28 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\TextData; -use PhpOffice\PhpSpreadsheet\Calculation\Functions; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; class Text { + use ArrayEnabled; + /** * LEN. * * @param mixed $value String Value + * Or can be an array of values + * + * @return array|int + * If an array of values is passed for the argument, then the returned result + * will also be an array with matching dimensions */ - public static function length($value = ''): int + public static function length($value = '') { + if (is_array($value)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $value); + } + $value = Helpers::extractString($value); return mb_strlen($value ?? '', 'UTF-8'); @@ -24,10 +35,20 @@ class Text * Use EXACT to test text being entered into a document. * * @param mixed $value1 String Value + * Or can be an array of values * @param mixed $value2 String Value + * Or can be an array of values + * + * @return array|bool + * If an array of values is passed for either of the arguments, then the returned result + * will also be an array with matching dimensions */ - public static function exact($value1, $value2): bool + public static function exact($value1, $value2) { + if (is_array($value1) || is_array($value2)) { + return self::evaluateArrayArguments([self::class, __FUNCTION__], $value1, $value2); + } + $value1 = Helpers::extractString($value1); $value2 = Helpers::extractString($value2); @@ -38,12 +59,17 @@ class Text * RETURNSTRING. * * @param mixed $testValue Value to check + * Or can be an array of values * - * @return null|string + * @return null|array|string + * If an array of values is passed for the argument, then the returned result + * will also be an array with matching dimensions */ public static function test($testValue = '') { - $testValue = Functions::flattenSingleValue($testValue); + if (is_array($testValue)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $testValue); + } if (is_string($testValue)) { return $testValue; diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData/Trim.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData/Trim.php index 22f4554b3..e52c00954 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData/Trim.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData/Trim.php @@ -2,17 +2,28 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\TextData; +use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; + class Trim { + use ArrayEnabled; + /** * CLEAN. * * @param mixed $stringValue String Value to check + * Or can be an array of values * - * @return null|string + * @return null|array|string + * If an array of values is passed as the argument, then the returned result will also be an array + * with the same dimensions */ public static function nonPrintable($stringValue = '') { + if (is_array($stringValue)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $stringValue); + } + $stringValue = Helpers::extractString($stringValue); return preg_replace('/[\\x00-\\x1f]/', '', "$stringValue"); @@ -22,11 +33,18 @@ class Trim * TRIM. * * @param mixed $stringValue String Value to check + * Or can be an array of values * - * @return string + * @return array|string + * If an array of values is passed as the argument, then the returned result will also be an array + * with the same dimensions */ public static function spaces($stringValue = '') { + if (is_array($stringValue)) { + return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $stringValue); + } + $stringValue = Helpers::extractString($stringValue); return trim(preg_replace('/ +/', ' ', trim("$stringValue", ' ')) ?? '', ' '); diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/Translations.xlsx b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/Translations.xlsx index 518176ab9fb862b37b8d1e7340dfa8341b5abfd3..6f758b9c57f0bc77e90cf9ebe2294c327ffab0a7 100644 GIT binary patch delta 89419 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

K;c4?G`W^O&9z8*0izJI@0xR$8eZwIIn~dVD?> z;NXXDOx-37-6*_pbUj1&`_o`vD0AE>Czh1zxO(h}sh6ywCpJ{wrA1Pj5#}wpJYJ72W`#la2;lnlkjajyOEXO% zzC2V0q8Gx4ow}ck&x!ror~>WhaW$#Cyp(-#ZmG zYIFXX!-n29bA}?g4kPd#jox45on%-D+U1N^A+QmyYgrhx5m+MZ4j=DMDXI$AId1Lc zGH0g6yml$!2>ocABt6NWo_Hh@>aK8r3L6w%l*H7T?z9f*Wt#wLci||8+}%nGbe5nw z#aC`fcOQq7`5pf~vFOe*v+XvHg@D(x^4d+=-`^Hrl_x&-5;J?UZ~E4-X%E<^XG|PnQuYeE114 zKXt4d{Cy!j`tR>a)jO!SXs4`7oSxf!Ai#675z_6_=d}7ccA(^fa)kN4=@M6(MaO`_ z^S6J@TwfbKFUeb-JYj{YGzDtF@eA_0(~ZSNi5%q6X?B>YikP68NbRJ&n_HMM-%V8@ z&(9=!&iER@WbzA%=rroxp=T)KqB0DjB4*2`4tGj3`A$KeEYvXWNyHUS_EMq!Fhhql zt`qnT7IxB|3}w>0Y(0M`b!5dkx9R0RIbIzg;nK=&YKPs_l5cP0 zx?NOOjD8cHbT0e0v!Ia#<(WND1K{N;Q58~mk*bS zF!01zkMMrm5_o&e^|CSG3DH|(0~?<%`u$x6t947=iyucmkf6Vo+&u{xP5HpsjilZ2 zg2KvIVoc?n8Ww#^`Gt+^-N#iTX}iNc&?J#GTh!Cp3>33bDj5^z{_Vhg>`_{`o2SDy zJFI`mTl@|5vxIjroV@tkZU$m$%~7E+A`UrpkINytU(Z5O6Z!nqZWLviCS#$-NLOtz?!{!-LIb>5}mP`*nn7l zb6iC{l$12BvP!EdbQsOqOfvzr^TMUH$KpaJy-(tgOwRE*U$+PlRIreE^VflArQ&?} z`SnZomI`Ok^JX z^GfU5%;Uu*1LOUAfyMg@+|+%Jhi}EthFy8Y@4nmLVM@|Ndos>!SI`{{?(qZ6SXn`w^=TG0GgXqV7m zjI`;y6C3QB%7f_poM_R3wmnB@X}p#kuqdf=oHBG1ahetc39fmDbE*~GQ`45W-!h@b zvv4gVjGs#tXF6**yz{ug@ZW`q>2==a0H+tz$(^3B+_BSlBW23ToAM{AUQDl_+zfES zNTb6H}CN}qVXjSXemJDQ|zZ_3H{SeVw(tKZ2SX)XPJS=L#7~= zD~vYlMn^BGX4jepH(g3LAEVr&Kk}~rprSlCeYdlERBDw`DYEfB@Bc1%YS1_5Z4o@v zIRdraY}azI)1Ub^3#YJ_PmL_E#C{rL>8k!#wi!p?JRJCFc*`H|6_R;#_5u&F{j}!e zQB!Wn8z-;I`d}S#kk2kr8h;MFjoe3}H8>*~-=B6kzh`}@n??qVLIwH-{u2WVOT(@2 ze;49}y}oT&H(YD_STc}wK_;8@yP8&hIq4gSi{`db@)%Y0guVwx;$?h;qRn#f(W3Fn z?w~51GU^`h*wn{cUkKRIlGP8&APSw-9WKH`Fva9l%^3kk8*rimO6R@eev3>N8W(4z_=6z5g%fLMqDq9FaZ>P&5Lxz_`}7f-CI|*# z>vfN=(RRo}&8Tu&XZH(yQb(CHMrY4()x~L9&Rd#%9KHEboa*9fN7nauuX$w_FLP#d+$OAA7Z+Bi0Mp} ztRZDNbFr=GJbw9Z`aYC$Mp@70yuWa|*DC(Lo5t&Y_V8z+T-U6B+319_w2rdDn@@@` zhk(pk(a8{7-q;sER#E=nM%q&k#qsB;|G!t5GYFtBfBP?{N4c2(Ojr4n%j&yzwQo5~ zXbdRdJfLMOiwLKI{5=wbe zb7-eM6-hPone#ZnlRdnumb@1||HCCf0MfRYxI8PdV`&19m+o;D!zfl?$G!;|TGWM9 zD?nt@qs1_OvaB@V(m?Aa7+8AjRwga#1Lfw)@_k9J>`^^mB`u`@AqNe1Gh&~$@V2LIiEoqt^lnU~opDPt-s%Jl1OL$iJ5>P>VsuJRU-={>CFN*sD&8IP z9%mBSXxfnPXJL`Ig6l)oVAq1Lt^$t10?Aq8OGWLgkWYrK@?5)>n+{T$=R|mJ=pxpJ z6t=$>Zpzvq)H25o3#BZ3vnpr0#GB6x;|~WuOqFfcf77(&-_vWKb;elus6L+aKg_() z+`i#u(SSLAsW4>mNq;@O9NC;E$$r&^L|$xjx-9?!79Sokos0Sb;_~l5dL-RoAUHGL zO(o-Np-_xeW-~7A{-@7 z8bmc6(+fAgXP!qGdr#lx2m)!g`o4rFiI z^FK{H-7DJ3J?c2{TupcaagTZ$&5Y!i#6Gg&nh>m;bCEajb?3x-yzXdtN%Oy3|L=*^ zYe>U?t$@|+Q9FCNO5J1W9;L~z`{geVvc4kXgHtw2UpBmqno9Ky=0=&emf%j9mC9p1 ztWF{W^DY0x&`oPe*?~TRZ)_N@pqa*WzSln*a=r5?Sz~=jKJGyQdu*AIdN^CCX5HuKj`iIO>g>!PNUiSovJX-G%sS z_LT6W@E9BsC*KcR_vM%D_jnC!d>J)^W~Q7d2}!2%J_n8Y7S{^@h>Wpv;`b#v#1Hkr z8sCfdf2E?v4`1Y77Ob0e*;jkI{my{Hm*0aL%tX_d+VtOUItbTGG}ikQzDdjzKyd`{ zOHObZZRTXgSl3U8Jb|`6s7?Rm=83|wwCt)V*xrqoZsU1rCf(q0J1Zg0nTRgyIe>(A zdfh_~kKY`^K_y5raX{{evm0pv=OwBFY9zA74_F`f{B8mv?_W*OhQV=0TT{%G-2KAP znGWytS``oFj6o;oX&+v|h?xnE0X`GK`}?_~ZSAdf8iE45^Bn3r3fq5}&P&@Qc?<5+-$?Y=B(Zzowutr zi++B?j18C`%-)OXlWljas^s}F_C-EaCf;_T+4jQ5P1La#cYD|HT)$xZ^_{Rm$L6@- z$>}^bS_T}cBxI8)iq>#UM+A&0&eM;Pli*d0X^<(^8BzHp+U8DwWt zUXmIJM_NWW*H6+M0SI{Zd}-g2u9pwd<9(#LM?=$T_KQ?e_75k+NjvhHUqx(g>G9e% zy%ZTj7_-mZ1>_`Z@5vtxBfQ558KyRt(VIr{66MLjr$hn!fVDIMPT-{$#i_lUF`uRe zo0g+^COp0|`SVM@OV{>fl+Sf#MqUF?tBKdTPn-pi*VKgT0EAH|2-TifE8 zxufV&2}VP?*FdJ}DiN6GAbP^Z<|Qh^;}4qUwQUSy@yeOhU=4M8 zTSVJ~ATbsMiSvBtwEo4t&A6a_+IezF7b~08Co%m49AY3aDy&v*$2%#;nmL30{)qVf ztQ?%y;F)bCC24nofK~RzoF>~Hu0|b?{Hn6eZ%Ol@|5c;*)sPdl@>%}{p6mX(Ob*)aVFmtfaz6~(CY6hD*OolbR zq_Hy~2j8YL9o`Bg#mQU@TrMauRt<(X-`1?RzVu2soYkCXQX<^uX?+ zMdJ9>J>_dXmhlrzy;Jw{&S2m?H|11JEtKDmJIl+`IC@lxNf~pu(_E^6htmg{S{yU) zRO06HP_zvKmfV4v+u~eCT770n*M1G0nS9y#>7sfHMbxi)FvMNqy03+?Q=r`1kKs^{ zuW4p=jXL|<;8|}H|@EqVEpl2H?*1-|+NhH9$q#4r6!Zm>~{y)R< z--%Slhcwd7g@*UMGym*iC&i|`MsPI3OSa$8G$gu5qW;gyIC6gy88UI9`~Pd%bWO(I z1x`gx^>Y0)TxjM8jlDBz?Xb><_ssvZsQ;NaiN-jybR)gjCXH3dlBtwVkEI;%ihQdw zZp37+glNB#zRZt0YHOd$5($|*-5xX4o2aMp0c3ZY|G7JX8~wU?F~K1IDyo{(zPof9 zK(im8r!N#QKJKB1u26J`RG^&eRi}hJtKj#GiSjAB1*)a zt?|>-p78?EQlTGV_+N%s(j-Wmz`oUqiY~=sSvYN`XnaQ-v^toZ7|GX@#65r zJni&V%huJLzE5qym6RR-5zdH@S<^smXsP8eH&;~-Kj){PH{?g+a7F9!)@jz?pZbNl zduVufC4cAS`sfpi&7YL%LF|q`G8igmS|P^Hhbk z+J2+<8DeW&mzKe2osQeMl}lQ!10g+SAy*L6d#KpM6z7$3v%TZDB$~-qG{@l_eW-gA65}l~-AHx4+4gymsc);8uf>E@isp;3l zGc$#NI)+x0o>PTz*^_+l8`G#Um8U#uyj#yx^{KE&1nOC#O{g;3WbqG91Kbp~bcGJ^ zH}|gq*5b5a9XnvREmb?DFSB%Fn|xM^7=h^%^@5<#qs348xS`tPW7=hx6~WAy0uV)M z3|)~Ral<0x{abnm?=?LpK%O$;0V5*p{wp$Qt$(G^5SC$SWysL&LR>jZ-Tg0U90@@u zS@@dyl=}*cK;uPk@_BDz#!^6LIzW$&9!=@byp8}uTV}3C4w+$9Jr%Lgiwa_o9Zi;LFBA00+GvlA#y0(~cNkJ-ZppEo}>OChlfo98tc za=uTwhRwSEiXHjPN`@3==eN8^f1=Zcd8M2M0#es>fm;zUxY(3Z!D&!sA&(!3hdy694Vy^LlX=D9)f&`qB`p!x(7YrYzd&rzG#`F*!$#8EU$*+ z6=zc?_>zp&McouMFY4+gb!3}Wcp^>hk+0v4ld#z%U%Un{J4QCMT^Z03Mix>|0cBW# zP={A}BsDR`jb#3^#JsjH*v$A^SZIry8oOvVCb(2~5CJtQ5zqI}@GZ4Tc2#~xmX+BKk z;)7;BU`4l+7+#{f5QF5#X#lcc?|^UAHunODL`U~*s6+LeCT6nvOdp>fyBwZ(tz`TcVk zb>%f*7E|%qJ=1CSJ0_;4Uz#f`KL%P@lx^cuii|9DeVYEAmksz^sLpq*^EW2UvA@Q} z(RQn+UkQH<+sWd?-H}nLFbzts;4_3?NwwZ%VR;0`WG?ERt4qJ(!97JjPsiY73}1@U ziI#r;rA{m3;~4o9)K5}esF#-`@u=6q!r8aZ-O1reF)4593$(e#?X@F#QTANvv>ejr z7K0@a@LWnPV)L!UcOaPA!WB++BZ$ZLwXzKb{(t|-{{3F_7lhxmyO;sVvvW2x1 zU$~%`PbCI6E9$Mh&dh<(m0PlXjLS;WHD{ zb*FNEZ)a))WpQ3#&EBm_JP}JAIvSw2UY~lK_LT}mPr}%PJd_Qqk0NG!gVbx_>wJDp z)Q1B!h3+<-VVVe3F&E(6^W)%L;mIC{(!WYA<}!~F40aZ-{sTwy6hm47xaJL4$Z+1a zN!Gt%G#kX039#E{@Mj^zL+0Qi;fZR{blnv(5sXsI_59%!j5U5O#HUqeO7TWfnhC z;-GFNAi$ac=xqmz0pVa9oJ|MraH>=mHa!8*Xkgu{Rz$NU-8ACOmB?^4Cnnc zEG4#GICW!IwdTzz^JYM}CI}iZ1%O#@UQcc5@YIdWbnux-=VCK*d2iP^kY&HT#RIqj zimH)jZyRjGdAs^U(9gOG^hJbz3@Ehc^G)zyF56JQ2#wAcIoJh(-(Tc1~A(D_SZtC(VCdPH1+4{OSTg8D}tWuyT zPrjY|)*VkPs_DGu6g5`lsP&UbM$3n0*BKfBJ~&I)ATn*k#yc@j~=x7A6F z5(kIp7~K$s9i?WN)J~__+W_mjfj-o=>i$kM!H^+0hC@_<6R6)p@MiRmRsM`!7*e!v zQbfwN_*v|^$ys3*;>HgxK`LMVQU3!aFytIjfPfaN2DAdnQ^?LdWx?W{`c9RkXHNz2 z)QLiL1Q8WycR(j^uC^$9iBon(13x^GkCUQ0x|T}?Mh}Ia zVWJ}RBSvCXQMZ1D-`3zjZ;ZSyc`~fv19IQb=)ikFZGK=zvt`Q&nyJarCg#x-j-=6(R! zR8@H=AM$2YTaRC0H9@Rh-~ePOMQ^f!HLyeoA%MMUg*v= zuj#y&%l61{^7%t-0Z7z$TQpY!8b$Bx8gSR4m$*}~D)3}`YU%)80!TT07oS?D#5=%H z)siAU`Py@-)F6p{XDo7Jrl|$Boj9a(}B_t$eIrt zR5b!7NSLttgcTk)ZRzZX8sfZWeot!L>|a$Hh$YzXuk0^|^3rFf!HPIUjXws$K+lYUFc8RJ*CSd$>V$A{EFu&PZbPmH$#%13+KQ-sR*c zLyR=L$M46$+`4Fz{#Fzek))*x?kK6qWcJKY^IbeNQIVmMqT1eUI+miwPWo6pf^@p{ z6;mqj*4|$NlJK?oJhji14{CVq(F4-9L|y3DM{iKtcW!#9?eE$C*{Jz@w1!e^{j+cT z=i5yYDtB@zZuqa(Z^H0_&~D)j!y%(d)p%Cn?$goUCUYiufLyO7TuQ;+YDqvSkK+#G|UTsh7ytyesG=bI}kaa9rGVilwkiGF4Q)g4j z*?*#(6|GXPnj;9JYvR~SwDzo}1I~y1ksltP>N~^(0Z$SQJ_rp;qm=*JLr$c?e{N7z_%W0eIryy#Z8S6h9*}6u0f1De;i4Q$vHU*QRza`Db zeleeku-agy{Tl^>dB=hj0gmBB18&7adEuYe$T?2X+E;_Isi2{Uj1bJHl$9A+OTFcQ zrXCFbsNJdOG9><*;Q<`{Xx8_ZU)Md^O`BIZ?$a#9e)@3TyfVp`LnZ&sIb-NG&hj%8{JleyE!b`zT!_ZS~MBJD=l@1o!($KfZ@qh1ol{9-C=P7pNNi-_~& zo&71jBF4dsXcv|GZa;CHkp?vLt+S`VgTXD|I(Gy!QagU~WO_TDWK+zf%vJz6T z?Kav+$;9(-o*AvZsh4lxpwx2ka{IXq*isQpdaVit=s{MSte1uCr?hricIAQtFVMTV z*MOCsVC-Lpx(ddGf72fDh-{)cpmT<^jJ(x+d%h8XU_1&EnEaIR^-Pc$M0@K`i1bbB zEaZ@d2zZ)*WS((BYh3+bA;gzgWm(X^;d7Aj-d^Do&A|KVOyh)7Hz5dfwI2m1NA8q@ zibPvTyM6`DoMpo=sy2tXV6vanQ%=6wD#pfBJuoWf;n}2 zef@rx3CqqjFWVuPkR#|(hk~H{R0umL;L?kMfl`@_hZ=IYn_41CB2jjL2fTr2>Ril8 zV7g2JsnH@pU2T+L)p)~$#AKu&zCZa zP=!zURl(q<7M?Yi9C1xlvrIv1PC${I0tb!!T+>!8FL zHZg-g4!e#$baT%zi@@Ujl(}e7_I_))BL0}bEi3%UJwRFgDh-2&-VU>V?1utrxirnl26Q>4=?_pF6x?wfiJq=;v+cm2;$FkN|>ax>upVb%bA=yJa1>Pb4Y~z3-JUbMlmT7{PYr&k#u&e^Dz-43Xzpvc^+tIA5 zYEhxd1=E{4OlVZnk)QbPz(D<&6EtDr@S3bi1IXM^S^}Yy0@!y26pK|fqfAs?+&y@os);KcL@Xy>K6tmErP>K5%dTnvgx$n3 z{zB3}WC)^LM}8K+=m;t(nZFsfpkM$V0vP6N3Ra4lawr*njtFpqDEfAbEu#}(I>&qo< za>R}tg7T|hqVf55<^uKd1SPP(hcxKy4zsCGpee&9um1u5*xo?;_8Gq?faKcKEA>N= zQq8ekKPLwtn$8`$!HbBN3626ut`6*kl~MS$e}!3ON6?0{s|GO8!qzA;UabcErd)4( zFmUfVp(LTQkFO~qPE}1Rbiq+7kS3L)0)eY#_6@QM5esPM7=B5J>00^FxuRO(Kv#8u z#8c06=Mj60n4)1pyIED@Pal&VB@4-_PXpGwXmhUS=w3 zEDW%Wpa@kb3it?TIOv4xKI^$;K31mcba}sWlR1X$K9B@dxh7ArL?NgW3r<2n<9`61 zo_rou5LAGgGiar+x;Q&X#<87eCq-1c!DxM4X8;jVBjYNyJb;=j6W2F@MmmTvx2l(a zr39V?D;wOO);OeH#0dGqpz)7Vp3uQifK~e<%XS2mCGMR#(S4u;e$olqANnTJe5O&^ z^$7?}$_LXp)XojaXMw*Z+Fz){O~-Rs71%LnGwOsv4EK4DzB-`N`kYIO>jnUxdyCp9 zz4q&cMSe4w4!LE7z!sG$VXGl>s`#t z6sL(8lYW^8%;Ns~9zQc-b);C04IEd(Ab`Q_LVXIl9ro6Dr0C#xN_waq@~SnkK;W*6 z3NNC-)97)F>tWbnX)}pXD%Gf)uTy_z>$58iF_|(qVK#NT-B*nXRfQ8i@ntqEfzM}m zy~t}#J~*Tl#YWx@@{(kghF{H7^|Kne@#lV3t$o#@|JYO({oR7?sw<1$3^}q>KeSD^ zA1U$qG#&bXC>zOb{@Uj5zEQ%g%zJfpB(Ep)&KH|poqCt#G3|8eqbHB;gT>l$l=XFj z3Dol0fqxSF-+G5)^fPVWv57@5ERNiEmlHr0eAS<-ipncm5cKA-lsY{XlM8Nwuexj<+%lJ81(qYt?tvpH_f)I>uCaMS&?yk;wFm??m zm;u~gq7pA{QbSN2y$24HDX$=1F219jhL!cgvK2H7Q>R^RxG+Obxms3W(-KAqkX_14 z1QjU9U|S$pS)!mPb?XWW?37Ze%DHI!x^>{AAuuw5)15ntwA|1+XmYsCBD}$P@dhvV zs9MTv#dJ{WZtfI@95BA_q%o#Mpk$3FwOkbr-f*FTe?VBhyux@2-D7S!q5=H+JiqH~ zKz-EFF$3?uB-J`s3}r+`D4Y^R?rx;$IcaNwPD{bZ1wm;GV)^SuIrty`zWXbtcT){C zO#gF3bu$UTLmerOg@WTsj38xkF@eQ}d>hi5_5F9scd)n+l*I+^28e=h_pI|d$J=Hh z0%H4)lD22TXQwRWT$%yF>uh`cvltXb1Lw05Otb`KwDO4Nw*P&$NskYDceVo??659O z!1iD2zdxt+zY$76a>m9RxB`{)TM&vd$b3z}@;$^WvY`w3upr4DCtznjgAHk&urPLi zdlIZ8(RLS5U)+XpmJ!AYH;Q&(FL`V0aaw$Mg4D@3|A0~gF^~#oG|A?2@@{`tIRVS- z?Kkup=xwCiEE_*XYG%&$S%Dx3@#hs@ZdVVTkKmr))l(GTdQP0TjgQhZMR@#oP$$Hm zu6V&7Y$LJItH?wsJnegv9&8h0-?Uk*IGJ@R()*P=NW*YE2AS5a1j<%1gFnToP+AR4 zT|KW-T}rgMx2dtg{*>DM`d`_T%MX)4Ognm{6$l`9rr(0 z4y^5~!_MDm?Y^&tZy?K$vQTP)nX!~-j7;>7ZSwEo%w(jF;`D}R%`Lm<7Ka|54jun8 z@hjtthW7XO#xdxu#4y9jtjGGmCBJz{R$Jn6X9yz+S1Fk1rdU_vhqA&^o&pC8fmdAy zKdmr%b&v9tK4T8(`8aTf`o;9!R?jkZGabCB_+u{4@<*y3!C~K=X_Wt#aGkV(5Wd^Qwx0RvhRn)YWr8gj!Rw?`7&vJS9JhAjufHZ;i z?9bp0fY|>6s$8*Exr|V}OSkh&!OvR>O(FF87c|}_USQnJ;mEAz3mT1!XJ>8IXS)F? zh_NV4Phk1Qd3?Em>tsr2jcO{?e)S9}B1BkGA%v=DjqPyq8!lA94WL3YSfYI(Tm1l< zuBh6vBZOo~-_(QF2%}OvMcL~qnkBHxt5%bHZa8H#UD)y9Ejq%*zE=f-S>(&{e5{I$ zM$RQUfOQF6k$!ecW#e+j1Kw%{Pt*&Es{nIVVj}-p+8_&~XP~yxufb&=)RmC&2OzSY zXi>rl5Q^ViN(dI9|K3xej#2v~@WBWxAsqj$`Yg7Kn1|e6{7{VKNH-vic4B{e?=H$E z%L&QUPy>^&uy=xVLEfm!A`O@jg7bBL^k{5+1U2CcA>Hw@ zCXi!Fhv1h%A`L(XJ|y2qibzmi!ul9|2~LL%9eCBM)l4VHUWQ`{MGxK~`UU7*S@v)j zQ2mEl@UfE=ZZJBH29R%jK;kOc{i%Y*OmapSv0O$KV_ygQq7CXmW!zc+ZOT=NuqyNB z;X_z~pF(z8F%Mt|w&o-9rt8it0JZu1Nb-cf04Qg7 z6aq%qB~Ot3?DU}MK)yb}4DmXVO;;0}m%4Ts9YAr?2bx7!20+z!=_M~pIgg!=BlD7s z#3I0MMvJ|Q*?0U;10P0l319~T5bFPrVz>k7cN8}5Ys9w>ZG!8k^DGZ^2bc2L|l2Q_P zkMH;0`@8=fW)3rRYVT)1vDSKqi*93jZ_xi1rQy7)2Z?Ftn@G6sqCpBkqA#QG-neRn zg5p_hb(e76xZBXAAJ!xN>0~W?++qGA0UiB54WBLfC3KviP^}Ga3Nz&6vTDuCkft>Y zseS9E56zRqkxh1$=&G(P*^vE12V91JrBh@v6*)^7-fz&;K=xlWx#DC%g}Ff!*8i$^ zYuz+i%lLx2Ew=0*^ack$7(tZD;sF^QV+-;YFq!v|mL)7O(PY|PDH!!Yv#}G5J&Ry_ znBdYW$KDS{cTEqAMzZFWV&ni}puEJ9vjTmfn)Hu+g(HS~=bmnmL(fDrlLfMwhk~L@ zAe$iAT{^vv-yGZ3!ZdRAd?lA6fUT4^u$cTAocnI^>bJl9lA*JD)T^aqCCjb#;? zC0e|{4tdC@_N?^fwv-!t7_(Bf$iqdIj$vk*+~+B}9Puh{au3Flo@GzD5tL2ddw;0I zK)E;u@$fhg20YgPU@`NcW?)&lwELC3DYok^z$pF)zz+dW379XC8S9u$@LQ|8v+1l5 z6Qv5uK_FP3%A6b2xe#5vwG8p&qxv(kr=-(9$RHsJ4Mpsv7E+aijOMdVxrp&k>d!ox z9+kwKGF=2d#nIKK9s2VObDJ3(Y9M8n)uXh{Fp;Ko`CmCl8x5xA)FT)opc3swgsbn% zUFQ-;drR(6hR0#tV(P9Rhk^u2wV7QTjvBtwwyemWTaJO;Fwa5de6s1Z(LifO%tO+HsO>4d!8GoB=Ae*m`^TSqZ5^zehu}uuP|C79f zed-?VKb7QCTxl0slwS@6?4pr_kind(1g)AMA(tb;tO;QTAANl;O`A!Rx(s;l5L#fv zJ_wgdLDlGrKDI_=RXUZif>m@``zCHpSGpV?@60S(Kw>&4cFZ3EY=kZ`FeaV+Kt-d* zr3sW8`nPY2r_)vnQ51kAz!V!RWQRb)wb#KOa$i z(Ew$2>l*`58O95kul{rroH0FCwPv0OUqFjYfF&LMkeLxGMd1g5e;ccVgukh**Ld8piX$q3k+er@;{Xl)e&GS(lqaa;sEa2tZ>(6W-y#YK?qE` z;+N$rDUkQ02*b&$aDt+wyrgKcSQ`BPoEQsWjbPK@Nttb0G7ehIfJeBoLec1Oha|8+wl^kVwg`pIX8)J8DHS{t$!q1gN*qBM1VBwM zxnRYdOk#qBu4i=~_R~y&x2jZ6YnDUY+WAmsBC9%UuDaS=vK>fmoU20|?u9-NScfAX6~$n*X?^0^tl#u>^5q{&Wu>aQt+6X2rM|*_`{BRztC6m`Fk! z$z=&U;*RVH{GHKcArcq7Pp2L50okB&6ej68s46960DPe|Q@~z1pf9yv|H}vVA;J#( zy5%Gioc4l@C7>#o8_4{4q=>^pj9NlCFa#!#AoQKZ_vGxewrP}#G*PHQyb*ORLQMt_pO+`j>DX3)o{0lld2PSZ--#SIFH z(1nw4?tQfk;kAtBa$5j^0v!GHP@o(o^Jv-*uxBl(+rLsG2p2QCJ%Se2bCPWDSdI4; zzl{3l$O_}KdG0{S(8KgPY0Oy-lA8};M6iN{v@SsVhfOe_j*3AA(N`7S=}qse$0aalFdg8 z9JwON!!-n;Or+QA_ab|wZ*50gR{wyE@O|Ya=7Dkd1yF7sPGSr9>6DU|YX{MQV^8>x z*HIk(Q}qYYTYxviQ87#nG&vTpys$vhJlmsr0E{Z-vrcs(Q#|0~G9M`p@3kD-L+p`_ zBO(GMB0=Q{1E+zztwu;V2NlUb=NKS;k2~gt?57eK(&ljrRur`VyyH^AZIMjLyIq^L z-wiWR+VAm$fV$=3<)GR((+M&90HjoI><#j6xyjiu+LAYBB?QXj3K%UOAzHoq61DBU7Mcr+@`M<2pDk`*K=WAF%aBo%b8&vr!uGbsM#a_I|*fN#!I)vUc_HU5Tn+a(n zJ@6>x&cMn(kw$+F2BMxOP$oKQvX5nl#W)!HSmS|E`jktxqI)#9!*CM zMD9#CVomu>Jv@a;iwTSl96&mJ-I`g3M6`I+3UQ@Q7ds3F-fd(zrD2Mc@3 zXl63VC2Ve4*+v>xOc~Zob_tY=dMN;c>9cza{(>#vw4kBJtu!v-aA-V(MZ_M!&X-f3 z(=xJT;!(7%wAt;5lV(z+O0xn7LLl@q(D(sp(kB^1!X(z82Fe`GaG8yLKwd-I4y5Ct z<&>$V*wI62ikBd|u0&_P0GBM++yJ)TwqXD_zwzGHzGSfg83L*-S%rFJpT4Fj6vM*V zz9RX!p;#(oCCWAf9}Dzd0#M&uJ|zB^HviANVk~~5ZNwVXKZqrxhh3e5nT>f?v(V9T z6U-0Hu>pC}RR^Y^9FEBO!!(xK=)Xz4)!RGaz|5(nrMW|Rw{MG#bA z+#N6DgY9uL(R`OL47@UC#&3ldbIc{bQsZ!^{KUWmkh8?MM$&|N-s@MmbJCQrM%uQR zlbkIKZiJjtJumvQ8I;=dG&|b`8V8smM zB#n8g$8oSlMJoH5xXqwbDi<}dCIwRX0eO!oK|OQXi!9_Ro!s-kz0w89QeDd%7mME?HKGbFs`blFi)2Mcrc&0;;eY=B>8|x7c6uPy zP{`7>$W>(Ia8+OBSO3wP`b_cBwPUPmDMH8d*0vSEYL@z%eOMsySS;m-=u1okt zHh}U^P5|E2AbWUeV_t4O53bvz530jHF1f5X8DuuRMYuSi8Vpd3S!)D40}1eY0-&|x zv{Dd^(5w=$QwH}n6;c3yyqBhlI=%>FiV+^^Jb>Z;V`u^VxQJgHH*GPmk&jOXs@s-1 z2qA)bOcmLm0N+Y6zKfdyA{gCA0_dHLFR3jR#vWvV&&Hc7`J8#y*yCq;JJ^$+6K-Ak z1Ne*p^_lSRa-yGvEMy+LbJ4~SB_FFXGd@K@rA*!Fs2+lGD}>3CW(XZv+dpjJwJ%nS zq~iiyt#tSQ;_q>j&EAO%d_H=cT=U^7TnNr`AIx!E?MyHUY-O?v0k)*6JpFCBH4u6x z76!9B%bEgr2eaxymXY@^md)@t*r^bh&nL=iu2z-$9E9>`D+fbsUa z_ZlZDz?}-H;+A_5nUDgtYG)K~s}x3C5@@!QH}o3-jo_Y`Pnu3IJDDM#!u? z`t|_pB=L*5(SW$|lGj@!q@Mk8YwZn=c_A0ZSEzKnn5RDd4* zJavJL$Hw|zwUi?q?D%0|`5Y)0AyksY36@>`Ey(vkyZFDNC0IeNmI!n40qIc_1GHjM zaBUO}xc;m%u<0Wrn6N$L+&q2-!eOkW8D<4C55&P%@$Rfvpeh$Wk1n4D%Z>|S$i}d? z9>As}J;P-HiT1NV#`vWGh=bbLUFnB)=W^=L7lrwra+XE>{&wheg2)i-WGW2RVr&m- zo8Nd5HowYs_D^7&KL~)M{gS^Sm2{~nEnm?$|VRt7?u9~}#XTYFCL zI)?)F<8a)WL;xR~isj52!Cvd3E(+pCjYEom8D$$6tz&^;>rX>vKOckC(TbT7*mj+o zwuK9_zy7Fk1t0X(HV&q1j|_*s;8C;r)A2>@})KT zCdl^l4}hq2`ZlL0H8{Vd-%OM-&fWtN_yCAhLIJY@lG;BX10A%LDqNukOvfOg5wd7D z>Nq!M=7j&r*U=6R!xc^TOoKt?xT^)Ch;$Y0#*6GkYTySUP-tFDS+3vR;Hy~_M!4wI zllq@Vn-m`Sk_G`~Bra9H==$%%+=u_?!uqH|vaXBrCRo>7-KYuaZGQgEfNL=`$~tSX zfcr5JY7CagjjlF|a2h|)RTWgeFiEKO4tM}lR&@|A|d93(Flz;b!NyCes`4sS{VDQ@iuA#hsVZd4$qg4hQ@PdJaIE>%(@{dDw8uFO^ie!e67H*dv7#SXyD8Tv7)Nz9V|FRqi3-uf$01v?4 zNi?ynS{#ZBvaVd0(4uL#A6foD7XH-GeDaRC@N-MgcVz80Wjm!47x7jghj7jU4)nQa z;5Q3LoU!*)KZN(sYYjJJqAA#yTn|8U%ud3GIEC=jZLeD@;qijYVIIRj~hdmu- z%}4J40tgu|W2H38$QT3u=U4aGN}!?9t}N;25SYUBi+vxVLEODLErRlNZO;0UaLm-+ zgpwa92^X?;7WQ5f22WvcLE-ityHo{XfEuap(VuYw%BWD=h!~z@hQidD2|M#AX*m)uaTdZalHB8F zpEZw_D==PiwjuM`@c#~zy7!tJ5m2rBk-Rl_C&bDTHFM2AbUu^KBWV7~nMXWNe@Yzfx z6ckG2tnnAJ)l=ozX>nK7O=#^tqERSF8dEY|40MrAWm(2RA}1U-dJD}C+bhPw1Dd7% zACtq+1TyeQ12Ba^#BKm222mRHc>k>1qNmo+!fF8G#`%rG^7dxHULmZZzOid9`P-e9d&btfI_w0XD*;{s+|sU*MrMrQ0%|K z9z_OpS(EP=0Hz4$64QU#e(S;5X3ieLi$mY@C9&oU=wfeo?&74k`GQ1jZTsu$+}TF+ z>8=iR+}!-P-S0A7@G1{wrdsN6S^yGA_`=(UQ%boN%HCo${gKjhUg+M0;88|@()pz$ znKxujyM5fnjx9!JwH|-2Uji4BK{5{{9RPxVUg*8MmJVB>d?+!%#7jan&D}DmDY@2; z#DRMct^FqpFMn)vwdI;WbR2mz_j94oyKT#yW5Ddr?xL_@76#Jg9!zLNk75fAa2|O+ z&k3Vt*`DNFHOKLPUbz%Q@@8jZ;_o~x45Vjb|y6+F8^kSynsuKWyy7=AXeF1x*lq z#gd<9d`(gJY6J2U0Divyx=#fJ%SxoMOwQDFWf<@iwZvec^n4m!;Ek2Ibi_dND`WXC z46MC#t@=bgA8E^Q}dZ=*aoKh^d=~w3Oa7J zgMtNspAyDg^}c=3+gVi$6kUx+JZQPCw`wzGx}CX+Ku7Kseha8C(m! z!w0fCzI&o&hC&slIo^Uq-+^2W-KK`^Sii8)c;f^+$v8u$K!g^QLxL2WB$YGf~|Jq^Hr@hGn!b zEaSBtom*XP73PhyiuKA2=8d|RGLkbvQw6!0UKlW2_9XvYUfokGux{$Y+EzX<*ORoZ zf9`Z5Xy>VS$&Ut*qcP{Al=~CJgzbw#=DQX|%mBe!x1)In!qubfKj%4`-ce0SE+5A`O;zaE4fsSMJH^m3>p}*!# zF&EI6ek=7$%bWwbi;uT`8!gjbnj3%m5jc_9=wZxw+~8yU*~rx_h2=}Fp#18|UUsda ztb9*hd~ftg6V0uLvAz<>%eYA{$IMVRdVH>Gv*Kj2)GlMMxYuK8Q#RFZ|LmL%O_H+1 z_o2NlvqkXFw@lcQQo>?A@6&XLZ_@Fxnetjtu2ZelvJdOQq4zI!wB%>TPt+Z1GOiZQ zYm*{WBRSk}o{Scue)Hf<=@SMOWr+ESQR2NFWZr59`nokKt??)a%v9Q;B~s5&diz}V z^TDjXnST73el_dTukyGKLn@`DT1%wuXC_dE)9Q$O-Qgtm04q&T+;CvfwJIIRUET(_e>Nq7RT=xn)FVL2fnjFAw)nsMrk;qLeODA)Zxv+hlbB`5_Iq^-2u{)-QiUn zK?rota-c0pY~^RkU5em6^BZ_f(g740a$fl%fNJ44vJRg2UXPWyK;VC)AOYZ<=%e6o zzJo)O6G!sa8vA(DMghaJKuQb9U_E_A9kt)T<3&306{Cb0}WGoyVfPAWU8O%jW>Xd;nko#SKrj-EV_6+ z$i3=dmIKSp!5b=A8ap-}wLfTLJF2HKTv~l2JMHV?s0^+8T=Qe#3}^>Pv%KRAT$D`~ zNtgP2z8OT+k$&s>ExH`11-G4nAOv}**a)AY@$6#)FuVjlf#*hrA)vzzJ0Lkygwhb( z$OeMPKpM5H;<-2jWvb`j4>y=!L1Mf7&dz-qkC|r;3sTvIDaXn@neGHQS&d_dE4M)S zz&i|ZJ?ITSS5`{+tFxo&)zhnfP1%1>PYZsL-Z+dBRCt|0zUAlHfdXoLlV`$FE9~O4 zH+zE1<=lM>(Qu3Ab~YeWx_f0ImVP45UzC{x-rx}UMpm1CYiD^WHt{mFBe%-b;GXhe zz^X@xzh~FU<<3GS_s@;K#oaFBmD|IW4es4Cma)3u9nCF06}#9R(hoOpxn|kTN`Cpm z#t+U*g_F`@@5T@}a9C~Q>r&~N#gIc7!hwUIV5wV^y3{3&?$`%_QXv|8u( zeZxvK#!exAw16{*h1>(`H=emb$sDa07zw^*>({Sk+~5I5F=-O`*0MiVC;}zPD^Q&a zGR=^~VS`5kT9^&%yDWug(#)0td%iEibslj|`KvVE$zG1lCE7<6`BHc%X-)TBUDNXk z%FVPilO5&DvwrZ5nN{v$qc#(2op!(<{WwRNiL}gSW{w_IN^z<0@?DucA#hR?t)2r_ ze#>`#G)Ur&v~^R)rr}-SSSJkbZ4C|Y35@ugOI0+xmGGKT#vFxmzGP6b=3XCwty&e zy_x}{r{2iNv&=N}#e&l%x|#wKA%2CbfVc0hnzQ+CDJ@DUz6pC#f-VZ>7I7Dj!rs0fP!2bs(jA+XYPBh@aFjZ-P$$#)VV?2 zAw6-k9Agh~Kjt2ngMq4P2Q^4CuMDtql>v=RIC%$X)x#ysl@dMVDf;Uowc4}S{Yp>S znm(mYi<)lkeS!n^xx>FVLc<4xnrCi9`x?-4DI?~q?s|n;b5tysWEJzv@xOOzBTKiX zpj+T4t^2d@ftA&Bv}ZekiG}mlL?v}cw~SED;{HTqs?PJBgmR-ytmre4>&mhq0ZFcz z50`Gx6_}rWF+_d+z39?uNTn{gWLp;`5T7k;*%e){Wx3mWm0$klUa_fy2Ni=(7WC`O zz~bdMb%OFa$WMF#Iq5biZ_q_=6y2dIlMnUN8=2bbs1|xjO(bRQbUcVC!4!n?mkqlr zxbxW7-uGL4J@cmSRK(A@yBX2c)k1G%r{F$V4*r=rY_}9eKk=FDYRH1E%OB(E_0!*s zK%?J0w&@jRq?(V$rmu4(s{6Sz1Y~2qCN{B7sx#~8L2ab6ncx+zF4>QV3V5F|Bbaz1 z0Hzwa#lpqN0`JG)87Liao>4}*cx!_sA8HLvp8(p(=stUdCWM7Iq%1Sq5 zn}EoHsl!O8#Dw1-qGKjs{1i6%>b>bc2qi&HNChMrK$yPg4K|DDcrz0EWPJ=BPm*^1Te zwLP?WHFx1+wA6U%ViB;OC+L+7YFyePgN}6Ei&xhTFHZCnJa+clk{Ik=h|BAyY>C%| z!z}}SBhR|Tgb*(vIGJyJbh`o`SVtJiCiq`#lxI#wd#~#ix#}R9F8I~JKvEYVrNvehCo)oy z0#q7}emoz1*a|dCH*z;yepTUrj&)MOiLQwi+ic&qFCVZeUy0Xo6O!TXB>X#w=O!-! zwB6`E`px^>Ji8gDssirOdGyotKPL79yYjAY`j`;Rb}5lJWLtz<#3x&^1jIXUi!>$8 zJd;a-hywe~`p1Z2PjBIeaCQUdZDrj|s~paeLDRO9v0}seuL=)3VS(&aOsEP%bJ*i0 z0Z6r!kQ8~lP=$<`#PYL(EfqiyR1ifsqDTM>3QBEoEwlYg0t3Ka-qN|Kx~CD%?x zg~*zFunx{#`sc&De`rbdjfFG09@=^Ld_*5HfETrv+@zZIr!?t*_bMAP(udHQqmI?B z9$G}~AgGj41Pf9ygHPoV_u1hQTrI3l(I&V3fNgU@zSK8vX<>#6(P+FLyOFAIqu4Q- zhH8(;#l0E^#l64F-VSY^+Y&1JC(7d&oA*pi?9?m2?au!!WMao6ap!GyN)PFlM{+Wq zeCmjFQ;p%+5lF8Um6Yum7;0!WR3{A8A{$=($<4bqVs}_0VRnAG;A9dzTX_DbfSF*) zD6pSALpSv(U{N3Hzn)6;)pe`Nu;G?#=~1&NMU~<#=CSzR&sQaV^k=ztZ`RO33sc!K zU5_tj?EZwhJ{!ymIByu9{AD!W{6g%@P(*P6ORiftq)r`1- zFRTB*i3tD=l+mXIauPpsCtsUVlm4v2uZwj$dtBIZuv`-|X?y9rnoWqp4C9mHXm?qT zClw46ym7lhrZ_!&RyRnki@)gb81IJ(dGdzGHwG5VqS;#FdV{VX+$$eImo`UX#l&uA zznHH`3B~Prxgr3$J%-JjGbXPhCH!9di?Jnh*I}8T!SkwmRyN51V{Wux<0e-i`uy+m zIa8G8Zq*&Gn(hzJ9s)uqe8>w+_n2!`xybh+k8P8|x{OxWBj_WM4b_KeW5LoJ1ft95 zqufp|iB^=qy~F@Api4LxwrI|iTyOxOSuu9+C1_1~k`D(!8E4l{8Z0@V3olVd=JZ`$ z9NxH=x=L#8WOsI=_kFJ8VOI;HJ>s}Q03K6+rq>qH%NG!N&}m|S%V#@sx_4`IcZDJQ z%fi_U`n7UK2ga319CM=@sNqqf?nT3$3Oh&4WkA7D;%mCcQlHE}}%ccQQ*MJsvUqOCeaS zvA}F&?T*Zwu&O%Fl9$Cjeh*4~F$N5hRakVlsIe>w)XO8E$4$`7^F9sT_pRt7=VtnE9Cn`QuS%#1PVX3wbac0Y(5=Fj>J?p$Q*?B~~peu$%!wo5#21m6Wzcd(3 zyjB^2SZ!1 z+0}Euo^Y`ro~zn<9&~(-xWY)vDLKI;u=Dl3zA|EFPuF!C*Gt(4n=C?_*<+!4FFx1} z%)ZiU`1yMPT%x9xiMib#ro%_DfR?o|f!GF&-{7~|jK}>H4FGEzY3hfe-;JBa08Bl; zH>*-NXi1Br{yQT^D*A=}p!n30_WbNMyUY1grTs%C_xH#Azn|BB9FH*Sf`FN64}k&s@x zL!qXH?vTmxW2U$|b1BO&3QO5gutNiOz$rs4$2?^i@y6Xrq&8vqWu~x0{oL;=Lu%u( z(e*(=Q6akjR|ilx6nU<1omQ9?wpAQk%O%@%7%2(6MArr# zTOTj3^m8#SE9XIf0vkkzX#D+V>h=GwC-|GN#Njw4`PdXt%NZlI#;m-q{{seta-Dun z#>?wfT+?;Z|4Y0tvS~69Yz9u15v--kC(||WDnW~`pgENL99AZgLg}stO4>9FMy#e= zfig}HBK85dcK0Bm{Q6O;U=ttR)*H}-=TyU~z{>MXkf!dMB=#T6 z;B+yd#=pmjyyizFluCbdramkrmEdTHnXN2f^o!S5g;JJ776zYo$?;#=JW;-n_zIN1RSfztpKLv=UJ+U+_YeHM0ti%HO$7Sl zTO8qy9Jp)Zx=C@v!d)~Gsf;oIQ;pTYh!YkEbJ#M2t;G|syTq+|_tcU4;Y4e+!mr#8 zNC+VyO@!-Wz`W%7M(R+_&Q1xBaEtFny8N9A-wQYg!~P7ix|R!(wIdgY4YHE_w#7kR z_wPX0Zng=Mrr2!AeSIJDPpx({0L#k^fF|7~Os2B3fB z0RxNYg6=OT35gFS2htO1!(z;{$;Aak`0c=CHodY!1b#q^yl{s=?QODD{B)ilK-;?l zXqe0LI#RQyLDiuX;A>Re4BR6%8iv3cH=sHy0H~xYZe)vEhT673;T(ds8W6SSeXso! zCqXV-*25*-D3gCd)za;vw~)1j?^dvf2bRXL-cMwFnZvF`^CV{sFi!aDC~KzKt^r94 z;|Q`;mJoW1#0VJgHou~%$8nQ#N~M!`DtGBxEp2-U-i&q$5APO*vm7FIBLg? zbrrXL<_h-Q&=Y4)X%YBK5Y7wz$ne+?wtg@>I(?NKAO|XE0p(1_z81hN*xKc!#Ho85 z#Q+Ds=eq_Ep!8*Kbote<)fEQ5az9G>7JDH#FQAlm|2|K0BV~KWx8&#?V2GsO#o!Ty zi@bx+vE#N|RAAf73=Gs6UVF;7WigWWgu>EeMNrP`H+CcE2K(&tNpZj+S(vaVT*U-69C>L$^e;drPC|N?0mhs!<(H zmO4~e7dZ~7-hF$x97yWxI$=g((UUv$i^L+TM-=m%9S2{oMv1D^tyQDSP)9N>NA@xW zXpd_mr!pr5fg+i`M*J{%Mh%}ZEo#Dy5qhgqVdv=xscwsA_BvbO_6<;TAu2J<0}ucK zz1LGdQi%ZS5U8@w3gjclls52b3@7{lcJ`Id=si;hi}1@8eZyB^5OtOQKXQ$@!yg=R zP;-wh=xM9jt#DXLtC=Ph3{mDY5W)jX$+>=}e)Jr|a000Y;juQOJMZ?>T8t#n@ZY`! zbFU}^)O@hD+@~husWn29q!cSdUZ8n`z@F)m^FGO`$+sj)CD6prCH%sn2?^jTZKI^%QTN-)gLqwp3j85)VgQO?qX+^6yCngog$WF{>KR=Bqz(qx0cDs-GJK9LthR7E zfl-vyR4{epc9#`=S(msi1-pz-2Gr496!O4zUECBW9;-w4)Cy6;l?`9IG1vGC#C!zs zLHT8RYTU9{0s24L(hfZL6wH)330b%YwN!*_8rv71L7!HHGOg=|oyAdwX1C@*JBVeh zD_J}E`SmN|^0Gv@SNLS%oZTS{1*AV&t%_KFxj$N# zPiQOvmut`)c*?hQZ8-tk1G!~LoSc07T>UTEuwHpEk+qy?so(XW!{4yU!j3Iy$!@Sz8Jacmg7BaRML{h*wyOsRlRkda5*@Z`2~RD0O~1t+*!_GLIu0^ENjXvSCY47`-fUb z)#jVE1M!BMm50Rb*)fm=cmS=<;Ni%`-*=@BU!Ltf-VvYX`Umj#`~}28Ol9>N!Ij9! ze*cDi!1VGF!UnB-8NWTFe|hJUpnRSjVS7sd@&;?TNG5zLBt5J+POOnVM>R;Iv76c-Jeqq+VD>B3XbEs)#Paffa zy_s&1<8U7jTg!<&e;T)dLV3Vciz`qa{vYDwzeY6w8qJu0kv74b36CBGrTghrgVtYq zCxfy>#6534R>`L|Ua2;&p7#^gU19lQlAA0EeJhpt%(MO%vNCF`foCw_wEZm0DyEK^ zf@=4~K$D!O?`n(EvX@gp3XNsDMXVGkBv!ZjY&e~#z^3cGVWam&->{Gdelri={&e5v zHL2ig4VUmwgxn_vT&k(YX=OFmoI!^QX3CWckP^VeIMTsnp8@;-x;L5PROVdksCrFk zBa0aVW6u6DL36ju>B{A>pXJjh8H19i8X<-?NT98(6gHP?5WMwC>bE2RfLB$~X^g4)kSdG6P%n{FY=Njbkb3XN}oTKSZwWV^G8(Q z{K|$wP5Oflf<3LR=l$!T4darn^I$1ZZe1;){crh4@X2ZrC+{!=og;lly8m5nQ1NEk zH&w(sxVpyem4 zS@IxK;+#LUGnn@me#ORny=Ra%K;%`g=N#^-%ymh(0)&SJe95DUvXPFhhw=S@^t)Pj z2OLOOiEg%43$m|cAQv=w^VQcx7Z4Qcsdt}+@yM(xo)c{yB2H}?k*swg44vDeG zez?TzO{JMW{3PwP4Fxp^kFUT ztT|89?JFK(LT3y5mRi0EU3y>`q5K~v9H$M3L){pBaufQys40_YKw2N`B;ooPC#xAU zUBuIJU0MOk?oxi5+MK+_UE>1UILK1tT3s2A)Xm(Z{lP&of3L?_;$ehYPn)P`pmHOB z=uDTiHTbf5%-m3f-E?)=u8>(NJj7+GOW8=GU~Wh~+?-<0W3Uy><{Lr^K~I^Q>~4Pf zpyKkRKi755d7p9Lam^Q7a}?(XabwWg7t4#kIh7*w>ZFicC4L?s z0Sxwq6b7S$!C<~9F;6c)l%1!juQRH|u*YReoVJl^O^LQa$ixOy!(AA;L`wRakthMb zafr^2ej!&^U$9`U`RR3ynh+O96Hb)J{U$%jy_;UUHT3MaAI^yL>ao8eVt!=&F`>si zT4{E97XN)0tubBMHLaasnIp*g;KX1kji8{`UxNytbmD`rt7hZwS^l`5N`|C?9+^<` zPzZC{diLD+j0E(j2*ShnTxowp#G|gXX}G2&g3=kKXAW;5B*5xe({O( zu8z&tK1IBJQ$9^!3XQ{qybq2K-j(Ew?w+6zHMtS6L#bnBv`N_`;^1` zVo~F2<5d35uc7C*{RyP&HRf~!H5taXYJ^K94zEgDYXh?ng(pH5E^H4)S+`qn=GYnlC zjmLN29IN5&u2af5?Q|)_Jc~5DKryd1nEgd+z!re zCS~*EM~dhb70m>lvJzr7Q_2G@9R54Ovc9hNHbN@P1+X0vUM6zfda0 z4)u>VeizY^ZJtN*6M08<)2$J>L?38Ws^5S8i^mYtxc~VHEm5~sZZ*G#{1f7d^Mu92 zgV=d`!>JVa_8&U>#GpIHkTYcUoONo;UyZXdC;)B}pORU>WD~8k^t1|D8bmF(dD6m> z^pjgRfOT$M=*mDT&18Be@iX?*T*J!CP@_q+u}j%*w<+Pq3t9PsPqi<{*u>tLm&s-Z zu-t83uI(w_qjA-~xZg%ZVHir({WyB)YNb@|A8%|Z^YXu-mF-NB<|1o5trA)0V_j&LC^ zd0Xc~8NCHdT$sO1PSWZS+m{N1HIyfAZ16#?p)TYD`&J||3_WVddq{iz0J|^hK6d8B z(pjwN3Z!&xy};($s4@*6{xxxYyb$KcG`D`%1O*0ZKR6e=?HSkIw|l5iOk?m-!t-#O z#?w>M)3Y+};&`sVr)sIJ*AeL;otVq=Schc9 zJN zhq^w=7hk;_@pX&y_iu}ZBXS|p-KMWX84ff}LwRtjd^@wt{gRvhg62}JC#Xcrm^Rjv z63CoRwu^+<>wfwWQ)df5EXbf)z%X~Y)xARc(Dkw7&u^OY(Frr1HI9|UNbzdVqTZ*vm3wJ!dk>g{i3tYxYs5Mmh$b%{dVmiSEyLu zBBz#na|`g^Jj}h4tC?hB@z}BJg;wcaU^i$-E7c{Uo$-k)CBpGhB}GM=xsb3A1^69% zrWc)?jNYHQ&TrF`YtNxdju558-h&^mIRCM|UG;>Q-2K{^V=c!_w1Q$p*Zl!OnZB{qjwt;A;t$Tl-;Ef>luiPiUzbp5->_5p`k6nQo1UsTH7Ym=I8K?(1(I_yRYRTNc>V zJQvvTqXfSm!{n%Lo8K9t{t~6Jw21FmW(fJE_7bfdzg438SZb^x@`U|-P=}2DX5Qie zjN&)y1raAPLUlwXs%`PD*^JV(Vt^0y*KYjK3$w{JJe+i=Z)=wu@0M=p2isxFe8C6V zx-pJ3KE_SI>uz%u$)}={dX~344M`6YQ~Y5rfpVu?VKA44sru974la2@~0z(zH7!>jbHZ z5-G@hs#q#tst|F)Rc~4F`?;Dv92cD|(ongxF!n9RsgmTOnAtJIpMhi}4ILSuLV?@g zX({oA$wCUn9S#ZHt~2Hvc?JAN>`X4KLH)@kRiSlhj1|_>1cL;l)aDM!llh*LDOIgR z+;2Z3`g7k4u-_Wmj<%3OSZ3+clgAjedYW$NkWay>CSE(kWH$4Y>+VrjOn}bV7D6k3 zol{DcwE}kK>87;hIYN6Le61|{%Tpd{H2)TxP*7yJQ*N&lP#q2Zu^Dkj2~f4dq3e;> zUxphPI&Cz06@R>AM%;Gmlx($aXq5_9czwsk^X~()_o*v>)nN_4f)xuS0dI=`Hwx_pZpOvowAOVl-qpNTri;gvasmX53zfR zUneaXQF;_D>Q-c{hS zr`P@0cuOADM~8Un{1F{?-I;eya(kr4V_ZKt?@qV_^4vx0?L$A<_`Ccd&QXCKZO{yA6kSyRQjZ_bv-q|kN9MXI%Z z)A_z_XUfOGZD#ksu*RyE7ZJ?G)^8{z)#g6Zh*zv-GA7JP-;m#j+9J>AdG1dCGG<`3 zbr(svG*vNyhu3@j(?h1`j}-}_NJRj8i8$Y4n0yDhpP3a~CnWiKN88gb>Uu#Np^?7| zBEEBsyYHL!yYw|5TgN`jM(ye*#bY5Y!|uk(irW-g z5!p+>(G&I1BT7_8%a>1i;dk6R%u|PckV^XY4x2Rw9E;5boV7xjv-ORO1C^(TtMx{8 zRm~Lg+4d~jf*G&At3;9NA$&e=YE5lZ&3X*ipn{02*3t`wr=FC&FwcGB4sEEuoMvFu z$P?#RS)v0UNO^KtRX)}HynqyW2vX4>0G5BN-3&M??h?8(0g_DWt1Vg?XM@iW@J2L zGgs!m8FpqEu`fS1HdhJpA%H`^Zh>pHA&gITH1P``{`r+Dmj6qt;d4Q~sypv?T-FWf97&YKaYYp8l>_IR5W~fAs}Ut@^F)KvXb~JebxT~ zQb4W00cj+QRIrD<0OhaE{zm1uRk{L$mN-~kggMefY4^$t5MB~_hr!)aHy7gi0Xu&H zcR?fpnMDy?BwRHICa4nAln5g3CRVr)4?kkCtQ{9D8?3N1y4WH##<(PM%_hCAfC+Q0 zxCN`0WYySi8OFLFB+784@}i~A;8NAmM?933XP9GfH_RkEfrZXe+mRl2#a*csgDTz< z>#93ASrIgaU<9_Fq+?WQaKeNs*i3(MXDHhF_1N%j4!UYKqQr3OB2!4mS~A{}93wBL zqW4je+o)+q!-;-AwgV1KT7WLi3LFSwaU2pn(N#{&!^$n-)|9ix1c$B^b{RXOa*_w?dks<(gZD0l$C z{YS{&Yqr%WK|q{L>R?iLaPSBcS8rC5>C%@?7}2+5pGYUu*oaAi!5s#xKYng#f1pvN zsZ6CoYdn*7;UO<=-TWI)^r$EMmtU_36Fm~yOmJpW6P+e(t2tI7c66$vm=(^^)XXzNJ1r82WU{g<5V?rl zCb&sx3D<%nWF7yKVIe79teBV!J#CSyMMsa--Qh+(bKe$Seq1*qT|!aopGSLMZeS_4 z%fj%Zr)mj%qu7V%ni+p=7i?NbjQFtV5l%_IT4?jts#ux`ik?^rc{v|>M!}=T zVL*FTGI-abyjp+@h`L&E6?ng+G;j5(ENygGSncs;3%2K1K{$WYop5mE?%ASxR$JKn zjNO0W4YUiRGTM8qXvI~maAd2XCAmFU ziUZF3$#%E=klvDytHr*jHsY$l6#^OPJyfs`kFcIAEgF_sECnuAa$XI%0_|Wl#)=5! zc}2hDd4oP`AXb0qQA0hf+$~%)3iTT6tTzeB2UZmLjrF*Vhea6I6Cn{kZg^1F^5-pr zmf2D>&kl@Z;%UTbd=4)}IoSFj-Zo2eRGtxZvaQp)CVu09QS$a!+7BKaIZTd7eQ-Op zF!40;?p5BQPB_0;zSiW?9xl^59r+eyjR#rqlZc2^i9>(GIwDkuHEhE)3T8{8SCD zZ!A8o&6<)Y-XSEMWTRz1{ym2h9!aqAiQ<6jvL-u3=M1$BFGa!$r&zGD-m|JRYi06b zy$V_t?KXeFg!T`pIG5|(tXf2;4$5XeR@cngjA|E+`aa$wvRnXHxZGJId8X9w>xFi^HC=1V8jD1GY?%8gHxf{&?f?&C|!vT2O$1t0a)yH7C+JlHf z`}_F_p*FIb=QuT$N4%KFbDXN{mNDJY^~-DpuyqKj%P&3IA0e)|8Fy+o)nTE2d8Tdo z8ytTyG__=XnbWJ_^U7(zuX7yfG^tiG5h~0{%R5%(Vts|D{oydSAZq>$P90*0+ZcO|t9|<*<|D&Kt{DNuEgy)LefHn+*5u9i)M91*huT#4=acIu+c<*otKW z#9S@P#9hrNx;$6D)ODrP;qHpB!SG-{Q@+C3CAiXwOUDtagVxS8=YYIE1|~uSkjTYs zs|0+J7mKl~qGU1SiQnENa&qqe?M+Ali*z$6&!Qy+b~;D}2v>&m^?Zwm93ox`L@a+c z3&9PXh&OXDM}#p%y$HTmo&oSBB3j3lP9Dz4eVdpWRIW0mtOa;RMJB_O$ zyoJiCSB;Qk$9^eXdh3EOzC<^@W9WrQB`_5u{tK~k7rG^cqO6PELdClr&Mf@wqC*G? zgVRt^o)#G@*@jnM+KXV#fTtPJj`x2*3&D7b*yFSjVLxUJvq7R2;npgB)(m*nvN~cg zI3Qvh3P)I6PQ&8SZ^aD4M?vj812X{`RO~6VF2eq#SDLOQsVs#X@r%1ZhSLOt48A{h zblwBxaDof0iVA1Zbxm~)ff*B+7x@A=6Fc$FX9A-D5y#7~zQz^QAMd}sfAfDAVtTl2 zxpZx#%8S#^-S9;0flkGXeq+9Ip}HGz-z@0w zWnK?!u41*wrvfpP=$7!2v73LIHm5g1I?msX3QrbUDnHw*sX~+nsOQeM85?KZ@cBL# z*05JF4w`8&_OZ}*7*@B(8(NBGGnlArhKtyzPYr|>%{COmW~0!P93w$Vs(hgvlWj#+ zc|U8As@cD@{KQlMRSS+FOTAQ4dj}VTG!Cg9d*ueF3YEvvq{1 z*~B2eB)=Y(ll~$xZxOG0hE2?+N!K4@%NDs89^OyG3%?J2g3aCrn^nWGf?(Xr)nw9k z)M7+XH_@Klgst2?gpfbKBFKFRDaR2u8U$0kI=t&y?Dy#AJ&?J7Oj`8gNb2I$N;S46 zj;3lDFSUorX=O>z_D_2J#&U3Yk=hl6-PJ8EGl^S&%3rb=O2A|h~5(rEFd zZOj;2rzH)05dK%gFjkSSZPKe&co_J8Pe|SoaGv5@!olCm_k2rm!cbG&!@FX4c*k)V zj|eq+6O#CjZ;Va36I_I9oLWk-)Fo~L$#y%#A=qrUBQ4j6t6wLQo_9%Q^_$C_f)UXOWE_ZDA_R#us=u&KD@)TL;e{70qL_{ z|7QXLdY8ok0gM4Sw^9NDL;`=jgNR-9dp1JjBt=gV$3~9k3@Zj<)>0%m#Kn6G<8I7R z;!&v~#VcA8f&KHg=`aYf)4&?UK!EN~M@fK&gA(6VjTLr_sWR-b>{KTbYq5V3G))R) zlTU>>@N5EREPJz@VJ|k!&mr8*O2g3*JN%A_ zXEo&pRR%?H_qCQ*tjll*LGEHMpYR@dksHB%`MH8}lGzrEb24 z2`9^P(WSJ=5CPc6TbPfpYFW5dZQJStSE1^XjRzCb71?a2WwAu-&&FNB?^sFZop-0*hF;!)*3kyM0ihTcsxuAy0 zeP8Col`uX()^v!qo>U1fZ5*cpmv&)^$C^T9K&vOYRc7kG3{JXps5ufZ>zua^BCpz`0jQyhpzT*+*i$vG%k=#c+WX7IE zH4+4l(ou*xmufD_372r}ml+e{o|rY~dQ9Baxd9XO?lrA6vO6t0bLT}mZ{hCfunJ|5 z~Ly-m1Z384d#B zLq+T&gq1P3@27|O4?S%&2yIC46FQJeU(g5v(>n!Dn1|Pm4Lfk&zy?_ z1I8evJFI^pbQWhlY&gAIvLJp|c0?ee3Ep4xn#>hp(Zicy5(plnBaPJQ9#P!kf4&|$ z_#uX&N9hqdo3b7yoRx%=>y-JpW4>wSo3*%917b>S%;ey3#C|+fWO_wIB;HwJl}gy4 zstK7B7<0|pWa>nv_qAA1oZlC{0Gymv0Ty1W2Gv>NoPkkEb^(^jat*4+2=$PN&$ZF8 zQg5G3iyPJT9>!@p2dy2EPN{~zPNp013{8$6q0`6e-Dr8@(xv$D1ZO9F%N92jH#XI< z#FB(IVMRWif0ofklb$&RP2Gi4T z81Ae=iFPcb7Rkm+I)em=F)4a|A(!+K0WJX-w<8h(M*#t|munLNIs%@Lm!}f}I)6J@ zsT#FnHzyQP`y6BsZ{T>ilaZPeF@w@=CkTSWog7|Csg+t?fQn^smvsVePxas@CIjM~ z()d=T}hxhYKR&= zE@&iE!D+AIuody=kzI>Uu0P&mv9GpCG{V|R{Ts%s8`ZwVfRt$-(I=E78x{59i> zCW`A_GQ|s(eF4?Naow38oS{evol-E$!I;X1g^w`eIZI<~tmevPG2D5uZhw%|*+D`K zUWF$y9m%{5Ye?d_5mJ(qyL?!&I%szitDLzS=oZi7*&tMw(9z6t8g_0@t6B8kfGF^b z7wjd3Y5=ozVPHCOU15F{>P;(ox2JoWL9U&L$^dIdw}P9x3vE$hjpJ{`E!qWkg9~2C zhM+p}Nal!alI6LFm~@^+q<=^-RnR6s|AmH+xKX@(89Bt+5k4rH8OMcC6;{$j*l^xO z*mlH~xFf4@aOxhz3{-Z0vy8Jwn4z9FF|01Q=j4t50s(dMZqo`G!Mv(CjBGzDas36# z_TpyEOet7JH`lZZYj58oIJ~YRT7er|I6Z0-Cf6#+Kh*l0n3eh<_%863mB48}twiC3ZoTY$gYC7?+B?J`^5*a0(D54shWCw+s4tIIB z!vje=c+BTI6}*aTSIGjclfsBn4E|?h7emMuw}#HTMZ<8QwA#s zyE3Wx%N9vY-D+p%PPF2NJ(zvdru@1@3KN_w;Q1vL1}rio?0>|P39li8MZAXCzqJ|> zRO9g1q(1x=5ktbhK>HfkIkLcp2=hs1o1bjMEju11FY>FbSN){|(y^wYt6%RiL`Qc) zqd>R`1n5^ZhIdYMafJbEsF;S+sKRcXFmg19ztWTflq|Z#&t%QEXkVtjMB;rJDiZO_ zP}*6D@9WH02!G*?+1C&VGiXRhp;(1$S!2#)$p@FfL}I-NXW0q$md#OD!EogzAc{in;wnqjiCLX>VHjZjBg$%;c;s?!x_^q?1*i_)vZS1WX!A_OCzvD+G&u8RI(Pl%i&0aEl()k#WON#4&MqxfkT^O z0dpXn3V&ifN^m9J!S$LrdI_H>bFL9N)*Ncn?s5nWElVdnM7V-jW>`9p%Ptl?0~mQa zm}s%y@XaOFm~ViH6yIEZ4L+K4@I>R5kpmlw{ci@wF3fMgLput&HW zdG9BaS}OEPcsBb&tHaOc_mHHk5~DT~zONHq{W`gGNo$WI9OVv>mLsdw)(vAQeua4G||oXxO| zp3og{6!#3N(M0T=&GFbRPA>X09vYqU3GF8x5~~c)r988)D)5+wIEHoD<2e#;SNJD1qetq~BTu^xK9m`mde(_16#G#7YPogwp zC7DTx<1yK^s4s}-pX_of9B{ibSwU*0N%M+;S}2x@&7q4EEbsVkdjptUIYaOR27?Mu zJ**7Pppv|$)QzkwBspj?ysf*#UxnvCW`CyQR}yW7w35`X(u3&`o!z+v=^%S}U$MI7 zbF-3gGr4fFwZDS0$_ZeQ^bv9}s98Cf_2oWOe62ftE2i8-X=F%yuev{ZWRb97?pp)N z(&(lMA6yzaTA9)&|0>b8IUj`Js$Ib}!?&P54{KO@%FY^sEkqYnrer=sYWH49?0*b| z2wo62h9rhhop(#JfbWYM0W!1rqkIJltq>RxiUceZv_uh?-FQUWYRXG8EF7WRF@iDUtWsf)a!cPeHtB)W{cGb1HHJTE=^}16s^{#NDGq zMi0l_j*zyASc`*;eTZ0W=6n-&9)Emc$a!;?O5brn6@IHujB$od<7*DiWD87W?SNr# zew_R0C9Nm>=V`;Fhq7~=vtr7g`x=qXJ3k#v8{}@mF??c}v@&Joi4yi2*lbWP3{*I} zV>{Xj=UKdc+~0a^BAtGosVBv*j`QlFX?CbfPCflaryk`DcV6O+FG$d0C?U8>W?Hmr;8BrC zE69WfGQThe458nf_$iM55>|qE|7UFE%dX?=re_Cfhf#tV7OX@V7JpD`Z_*qcmmuSv z=%$gk!Iei2#A-qKAUqSS=mXP&Diz1yo2gIOHJkFrF*t38>H1B;SIQM9O2XJ0^YNKH zqa*1Y%V(SqX++EmR|WMY_B7oD@)XPnYH>o)VCOqULd?EAanWE-q!=!p649W%3#U|m z9#)cIibD!Jmn1=9jDNFJKx99t%tRr=8Q`uG0pY>f%teIcwIbt{M0P%T{|9R=+^#TD zQ*&Ws_Hv3fD%_C^Ub8v;e8uL59*0rbD$YxF(WcEIW+Sm{DM)HO*cGCxGzsj^-3mr_ zgsaLU(uxffxY(rW*(qD6HurGtp;as@ELaE6o)8062c{N&KQW8zg z4ZjKDFHZxbtfc*ADz$ti^qR_(x)@PWQ6xB6hHUFj-8*^A#OTMsfwMId`v0Nj)-H&5FJFs z<0I#8Lf73>zPLo8`pA9Jr*!JyXh+8<8lckA2o2 zs(*{C8vuy~x}tPLGu^p}=}+6TYsU@NF+ql@e$05c;qJszbsXMu(7wC^clqV}!&?z6 zrCoCjJM1UCIztFRT2BkOg7>R*7Wp&U?q&)ishh{0ukg5-dmlOFo5R};I{t&$#%Ikk z&#c=eEE4=oXX+;e4NOU=PF2ez^2_)3LVse(TZxx-K*AbYR9`8AoI{9Ht?7Z83I{%;RM7MCInk7t z@A&5Gk=(~7q1Zrg8a9*f_U^=I?pPjvq(i*?<$LNQ?7HIMYtpO3543lJeW1>on|~_j zkYCvAf?!};J-iM3qxbkOugb$);z11_3Z@8dM7w93no`UCw*!d?SMzs;U1T@6>si|JR@`%(KED~aY3Q@;u{*pHxHlR zzPjfavGwief4O}X7BAannI@}W|9=Lr>#LgCjK`~ZmaZZY$uQCx;cFp4cb!<^S^ZH% z$1zF9PMq$Ohwr-K@EwQ1TO^0KgYfu325cDo`Hjg8=hJk7Cnq<*{w?eqDu{@&24$HU z(EbLoFGS26!yJBuluI@OSIMJPrx3)J<_lFo9ipdzvQmr*5;0>PG%~AAN`D*^AlBUg z6v`^j#WKm{S2u?rQ71v(_NqVpi0wt+!9);yuvG9k?gyK~x2$@*G#Bha=*Q&B^U2^+1g2O+S?n3fC{nQ|VM8!{EpMM|2e10oeTytZjpJkIym-ea((-jz5n5NQbk zWU!TfT0rcmunE_DOdFjjczPnnXwOa}Pfo=8mWS`QH$f)ytBL6I07tj)+KGo5R~?&juV{P2?-^2!4q&!PQ%oBZ}C) z$86GpcC5!l4k(XAW{<;S99PfT zt<)hS?^FbB+d~wUYJVPJv8|1nBUV>gBxNc*BCGrg+97mVjh>EyWsl*O2^eg%H|Ya1 zDjiu~^6@1}utXf7omIBpBxQbsC~3p5f1^hF^Kwr#QmpV!A3cJ(jvIo{3qEvgP9O6} zv^%iF&&{X*6OH&q?IY7?CpDZj(Zw?F&{t+KOOBRMF4^}Vu792;RfL_yU5sU<7vwNu z20It&)G$iG(o%2S0wdWm^Si4B8#2l(0kftdKeFMhbK^%A@~}6HnqK|lPWp`KCr|YAeRWF1A3$uni_CT^{u=_NGr4fw9VkuFg zDT$;+Nw#Lz@_&eLyB_abb-$PX(VlZ7v#L7JiEJ)NHXCsxA|q}@+^@KC?>Xm%6KL2q z*vOTg8&lL<>`o^-K`?uK0h_DBxoJ=32)vkWOMU3jv|V?#UE8*YIlEl!In=^ljXh^@ zZoZGABD2d9C=m*gDiuX``4K62rtz7~(woiCN$j4=E`PqP&Nq0azp1dYW|IflOmq|g zi{#z!`^$wS6nbEG=!2=*{I<_1%we_xdffKmw5(PL2xOqd|6{%u4u}9!yC*`JpTpuM zViP+NgBAocBSy}FLj*As^n-1goyEsCqf&4P6J=jUF|8&%cu%jCDcbYMk(5xQ^~UaE z2rJHL27eN%m)q$BI$MJjN<>?Yp*mI_3`MGF`c*Nc=mH7e_4B&aB}HXfJCtSydQk@B z8=mWx4{+V?$mtoN+_;}J?|n^|R#EBWexv;%=l~$eO8NPva;f=GW}sQ>PoGK^>y*{d zd1fPxhALZC+gNXr$0qYf+!^6^`w@H}B@o&q zqkq&OIeH1px6Bi=TMs%Z2SJo!^GSmZRZtKE}6<5ji$ zp`ji92(f_@@5(Af>Yo;)-BXZhl@AuXClh5R4MGfM4G_4k><;1(&k|MTfRB7g>7tia z#=n(7 zVNXlBwS|c+vpdf2DaUf#1&BDpa5@lv#Rp_4&oqj)YPYFdoDG*3YJnwbTOj%Rc#9Jm z`JLO%wMH&Tv8f50$F>ettn#?4Z+{%i?^a{fVhH~#G@oy9gNt%(#`YA_+bMtU4_QqO zwwtiV-ni$ECx5ys@73Y z-ohOI`%wff_C2*KWjmv%c1C#vZ86hy%6&Rb9E$82*Ip|;}fuxQ6hG;p|wr9@6$52 zBvV^&3i_f5<8GdSWw$2M2~gM(@eePn1$Xx43~I_bo*LPqvvg5l*@PqtY}_u_tQsc7vn)W zqT14~>$XiZac^m<#v2z!J8w~>p)u(~XIK%ZJq|6mMM&sTX35EH1BIdoXYhmvWDo_O zz%8qd06ZXDZf{>ZC4UJI$$&D%DS~A#Y+15dPjno^uWMm2v>j=BqRKeyZzgIo;r z5=;FxXfUps*DQ|9(r(k%Ioj}}7;Z-2NaA^%h;Ku(0m)ZRC1&9liGm1`J(WQ7BZyk< zE+G~&c~F;NSfd%TSbixwfwj~moC*3{hw6JGF11_MBXSvMkbeO&!gDz#yl$4NwEH}f zg4&?FVvX#zMxu~rvxU7~2%hUN5W*u)MEw(lzN|1vyZYILcF>Q-p%mi@XCkx>myh{T1;|2Qbc+9E5qS*W(+a z0q#0Anl+p~E4=Jidq@L-Bb3I)hEL{fVxIC@?@A1cQjqJ%JZ9komo#VL(#T7^n93BQ zRPdAP8XwE(e_|Z&5lsb23k_hVewA2D?h&L`fionO4}Tey>n9Dg7?)S*5jl~E2s|iw zx0S5NAtHex?1fO03cGC}#rWbvvpT2J47O+I=NYUXr!I8*6fbRHT9V`Z{YuVGD)@O% zbq^rS$d=h85yW1Bh;NTf9ED7#F28J#vo6;_->DztJ~<_Fo5--TZJFzmaPQn1pjqEo zYvHv!hkws3sF4cO@Z_w40|EAD6I?!;y@8#<1Pe+_sy=gHA^<@eX&WJMlcqZrwWDTCtNl^J%uM6^ zOqr$c9Rq}*BS_F4+o0WJz!4}MVc$%^;ecY@hJS0MgVjf)oVIbYRMhXF7F!=v0dYDT&GX{KW5rrAKm5|@^G#=OI_sP#7RtS$jzv|~^~l##J-g zxd7rdK&};=a*s6JMT*(J#^#v_{;4a+Y6IdNH2ZJ>_d5;yHcO)jbDo-T z9m1Eyd0W;HvPPK?7gR9AkmL|)uG}|@Gk<;Rgb%Q|=$G>$%s_IW(y+}V_z30#1|^JW zHC&LK33+N7;N&`qF=nGyHuh#7`$SlCGhD7cbJMnwg*D%9`3iqHnH9r@>|;Lb%tPze zNDbZ9JP#hE$!TUtgNV6BPZ~jHR+zZ_LGiIZ3|A=q}KPoMB{l>PyTS~nCPe)g< z#(m?EmLw(w0iVmfOT?Mt`xPMd%pTLL^~}-;iec>m@ceq|jF34*Bi8~>+@N(rJlKSO zmVG;{Db#QTI+b0_R)jIKsBcK6*?&UVU1o@jp)gW@$bJN;zCFv_V9zK>%2=Yb-Gv&M zO-Tm%$j#e~ppcU}+lP&jjb>zd=W131&xhdv9%%9F*ook6@Q4?ZF?Gw zl)9L~tfRArG$?&w_Y}z4A+;lqN4pEoa#c;{P;tyS`R<@VEQ_S7$+!XsF6Euca9^Gy zN`MZEt|(@OamgWKDZ`Z`__c0_KE%jEuF36dLA`%IBVQ#IC7pWK6^fDjHZS271qm46L)^ zPq{L(G%L_)CE#IKr=42Pm@~Mi+TLoOV9G#Kc?L&}(7qVv-XQ3gZ+;3hP04GsZ6nw?V$*F)8|M84Y)nfL z=sm+Cc-i7FM$)B;U&a~+S=U%`(*2EcBbH}YxL>vRcKi5YNcIfqMM8)tW+G{$qG?|-QUgEfpZQ)F?&HQoJn zWxt$!lpdC)u^lg<`Z@DogT!>lZI0qqkpYdT3DO>KQ=YReC%VBqaVDWOq9>SnAI1?& zxR7*p0?V$pYUXjcZ}(KC57|Y9-8Dp7wX8s*GMU&IT?*DU={}Wf!lh_52t9~A0!*=$?0VUHk<%727e>BN|J zuZoq6?hi($t|}QMCo-IbM-v_s&If|Fh!JKzD{5bbdvOJ}^T z2sgvrfX&7BL2%Dwp|&!$D;x#g+~=$pW?MMSHLk_5&Xq&#W?_h@;!3V@Ey}pX%YbSr z#(xVM)^L2>?Pr_3M zz4I!i%5gB?-JqAsRZ8iNtF79k2ffGusDIv1gC3+3HTcxU#vu{LCfN}^bE!9Ap|)q9 zfeaduu32>f78>V5#ELo_RJi+)V>K?3q!|}?2DDzw)g0qCURMZYyoM+$P-ZXC>-Y&! zFMBTKV7{&vBPMK@c>sKXS!cV|@KX9@na33_M+c?Ooij1>&QGu&Q+q+{Vmr`F?0?~Q zeU`y&sPE+&fiW9{ahh?|LyL@?p5iqkEh0Nn|6+~XBxu+pF|M%6OpGaa8^S)12S4p; zu@2qPjJHtu_c5WfoCU;PoaQ1g+8Hxaqn+^?f@{M!ua7LK?XR4G5FBxRJ*w8YHFLFa zuSh3F`n=r(?&#RTs17OD>!O4Y{7s_K~(-I@@CRG@tl+dejyT0jfqxW~)>|NNg6FDO=*JzO1P zBWvXh@$bV?1E)5FU^`LkpI1PA(T}3gVD*|AaMgtip?P?UhX!Ie4%S%rB7a@$>|RU& z7dA0k7k@((?c1X8Rs~VAG&3?XBEXgVHX3#i0QS2)vzO4UAH^N z2_F@SHOe7~E^09t>(FirWq)67BStPT)qv&m!VUg>C>=D;Z+=G83z<@Rc8#k6`nO#Q z6|7;_s|wAKQ9RoWFxPDEreUT$cV!$R45_j^Vi3H2vwI{#am-;uF+z%BWH#?%=tyta zUP1;mD9=DG1nU&)S0ki7(ojDMV)0bBa(IGg8laWFz`+W-oj0(YHh)~ya(D?~LW@uZ zC6q{9gcR;3?FLc+RjOnTm#ixzO~rCF5Do+>D784bAL&s-x{`COwov)uQt8xid0vs+ zAdRDb;2dg`EE(SW>oVjZ*_vXy1afr+mJgJ?AzX|JQ9Q!Yoay9+Uh zLU7Uc9O}JfS81>)OI+ghAd<}H$ikqlk?R6}>RXV1h51r!6=cC4UYZ6;jrY_gv&`}Vl52;vjz>DkQQeJ`8E^p9&R4WK?xWX7Cop_pFRVjU;^PAb9 zWgqvMm2vM{_pmWRd~+3$n6;i0(!O$TZdT{2l+bepHmCM>OWtmgp31~qtR;E_ISd2$ zxe)HJW@}M{!hf}m5=yC90g=9_h6B^FC&pIepj)9kz9rrVLd+9dnu=FzydTs%a@_e3 zHPm1;P3fyyg(-~^y|fhfRN@|NSAq1Kv?-`aYE-~`L1)wT%1tW89lCrY`JL$^7}1;K zF+7L9U)X9Ml2Q9c*C6_|=4U?h;4K)wOzc05;K5t-@qc=mfw7hPx1LuQ#xewxCmqd( zaO)MhB5w{oLgefpK@J&5sKr%yoPjpWNlC#Fx*^zPGHK(GvmBJA7E@%V_)8Rb{PfmNNFy!E21(#AiPR{HS zr_#(SMI68!EPTt{+Eb8R&I3`-!K?*lpai_a*L`re7x=iA%j97uZ?R8%OzvYM)n_t^ zC(kgCuR~})MP&lPPb_cmoKzK*KOFV;P+-5Tgn#&6z$?sEPKm@PcIB4S;pKd-h{FeF zyme@Q7;+~snxq&amo1G;Jx3MjxOI=h5WX2|6$4Sew5>6bjBXUd-tD6=2sIZw?qm z+<(ZSwR0B9h47;$DxRARGJ6Sm0ckH8=4|N76n7(`$0 zikt{xd1O#^Ctf(`>m`HffoZfRDW**HX6&3#kNOt>T=YEHJqzmo+!1JTAU;BuiJ&w zU%&fLZ~qv#Ts_eb$4g3nC_4%9lFgTS= z8Vy+s zu3f=;woG>)$c99Z76llcb1-saJ`Swi`w?Qtv-<$fVw$x8dfRYplBK}j0KkPYRwanf zZF&WJ{BpFBtpeYdi#!M)8GpeJG(;}Iv9nx)Lyv9tQ3Bi$F&{w85YMXNSp09IkWYn{ z8WcWYVvI?pnI?FiJ6-xS$+7ym)DW`}HN;G2I7w+iK~dU!0aR+FVH*(2WIn&xJrnhN zIDuJG$pMPhX=OO^=Nkj`Q%e9dvjlMKH{X3Q-aVV+A{vi*;W@n=`G1S=Lp|)RGtjf8 zz3|8V?GQKZJj#W>T|I%ev3S~0AJCmbE7?>D>dEY(B_lDw(@LK!mlH^cS%(qAE&eEkk%9D6`BDWupS?}-{pAs0X!x|u!o@umxJJ? znl!VP?c6EG<*kx<7&Gi>O=Y@H>J~X)tfy9mDX##5Sq>SAaA^*w{yOjq+z>G(2E&2- z)yg;sAd5U>;w&#`vJ*}~=G`aWo$8fqJq$=hjL2nmEq~h z0@>2cxtpA6;F}cmroAi^qEiYP_%3`B4J*Zh8TsG@Aw2SKP_=N1=#lO30gcGFH&CDS z17L!IC<$EPvfm;>VIE1968UlwF8wAbhgVReFX%trz#u%OF#?TYE7(m6F)_ z`bCxwrGJ)jiLdD<6A-C!c$M#a#y!5dsgLR79zP2*jlkuMTyko!0EdT=)gDKeMdK8v zxA`Zg5QnYjdjOHUXCtz|H2pJOI%+oF_|JZ!S2~Y<=+J?XE-~TvYey! z;(toDVBg8494+&!%M0o(2~79TnFu4enRX#Y4)@X>_y{9-_N=D2wfVCQ-4pjm6cwCn z*a3*wXzf#gjm4HA5w__O>e|Ldw8~-iEi})r&`}Dl%MC?9Iq@k)iW^3qZw*FC8GpJ? zzFewxfY;DQn_J{K)abIJ?a>oUY}XU0UVk;iCU;KJ6*n5HbRj=A@0;5bK3+Eqx1_Dy zeT2ozwOJdyPH|lWT*5WJ*IW#oa~Df0V*O3yFCbZ zJ-Z1H5|1o!nEZVZinAl%@ETUPx_{UHlyK*Eg*t!)zv^jLC!fLtp9~Q_aH)2$MfOE@q$U(eLt;(sWW*L6?3 zC-RPOJnV0gGVoZTNG)Uv^!G}`%Y3OfC~iMTV$rDv$N~s)%BaI)@y#IGaCJ{ZjrmMN zouSxdyJD%n@Qshm`rD1Ve+-J*pnn0OGV#6k>Y?QwI8#<>S_jmEk}G@-#XuccUjMQa z<~xn7R0q_z2R1;6-P_+useeWi!lD%BvU`f>g7Hv(B{z082tkmF0VNc5-a4P*^D4qI zL2<6@+JY>;{T zxyP`ZOlFR0N$TkcR_{WyGwN?|o&_aX%tmq$2iLnNmm~NU7wk=M+dth1%GK>TeNLYJ zbiIymUZF zA@apX8zm>7(-c;9xDFHFki(zzoD?&4(xLZK9vV}pz?W;8fz1jETgcD=eMDt{_S&9X zd?~vwcBhZ7k@3JEg5c=0Yl!b$Zi`FKyTUU>6S0X1(|_W?lrNrLPeTuq1>;BDq@piB zsTuNGFVr*#;TwX;&9i|Bf0SV6Yly*uQUHwb!uss$eUX}@rxM%Qm|6&Hr?(bm5MS# z89=1N^7fH-a9Mxd{tYy_UAZpKtVjb@4F_Zd;-!Yo)wjswb+7$V%JbX-O6No3lm(vk zmfLb6s>}5TDaMpCW2?dgWIdTmgIe@YP(fS0yZn~8u5SMd4{}`M!-GMleZ5(3*Q4?h ztOB8HC!(B0KKe9cz1ABr;WX?N%7Id+f;~irk1uWdmp6aU9BvP~l5`1t>DHhj#fYj?;ue~i?jD$@}qNU<ny^Tw*Fnx1RcYvr3DD*<8r7Lr91kw*m(H?3V(f~;sK|v1r{(2!agB>!j#*sf4#Vn$cnGmX+X;ekpfR?Iw7uSd z?$#!|5(+vs2_1lHppRE+rOZY_|ce*C_|CBY5P% z58f&!h4t?#5y7LFXJMF=gz%}^jy+mo#jTChf`Xj!x+zzJbbw?KcYtS+x0r2VP>MUP z_DX-AfOwLHVbyRDDx;}HuLQ-`RwLm_Xm|VABCX&J}2V zmSk=l=;HuXjTA%_R}R&<>|cr)K}H;#MTrhFZ9?pXm~C`DHVF}2Hc&t^TOnW>F^<%- zz98_I0Cy@t+v%w&7(2T@X6AU;t7d|@))0U3hHlF9t9;hA#tE2hT;j33O+1x8djLBg z24Mw8jR!7n$O$MHGvu_&vf75UL{qyQzvEYUFSLT1v{6N^=?wz{RW-WO%`<4Fw*Pcg zY$*R4_v!6!{vZKM3@zEw#c2(1bv}@&+S7~Dj7$Tw#Lf|6;?S0%Ntm$8HBHkDk(_^@ zXrmeXmJ*$O68>7NnI^$uToHBhiKWs^*fDA?P9uT}o1wUT`|OY&F-=s~g0EPXyhkt- zX@WJ&wtyfHCztZFVb#?obLAQ-P^!_?l$lX50;++=$P}C+`5LLXRByxv+;!j&b#hGM zSiyEvzslagogD)mKzh|Mx>9FbPMm+s8q#0Q!c>>*2e!4-Dz=*xM#ZQowf`C*DiPEO z%ci!%4bNOGG4bfUbKtNiO9=8hq^%H?v-|gLT1L8*y!}1|C%pk>{>j zY+y{deIx?q8J?+zXHk5h!y|tu#8{_uhY0~T9A4h?J358s>gIjnk@MNLY-t(`rG0IP zvj~{uG7EMh#q#OGNRR8~`u2Clwg=-kjA88J=Gk1wP35?DL~MVc#wcwS#(I@?|2RmV zF0a)cpcP6(s(`%Z^s&2^F;7F#G^=eTnENblm1x*aJ5X_1YfbGhp6GuQvN|{dNF>lT zn*%VbO;CK#&N4Iuf0V9^u&hbbB#LKy>=u9zQgpU`RyaM(v=#}oJs4q91-WeN`@}P# zvs*wrsnEGM?~~C^`#~^sH6I=XFx@s0la4|aMUCuKGlEeq-zcfDz1?BiM%jG>U%kW1 zW;i!65sbDyq61&c0=$2)a`;|`;l2A?LD_HLdk?XK+QmQq^N+v#@zIZu_W!Z}Kl{J_ zGczg4dXLoit_9l zd=hKtu=rvxw{U;>{tMLq%y_s0ls?2mps4>GNP7_nO0Thu;)P+UQ?n;UD7&b80$aQ>Tb&JT-gd>jnw(saF_0 zDFt_r4)J3Qfz;y%Y1cqubcfu5=8+P^Gu!ed zR`Z8?@a~Xv)i}K`_TTF>a;(=WToj2GT(sd9Tm(8G^y7kmi9$z667*kV6ki*X(zGY} zezpJJ9`$GYuM4x~NZ$Z>#WCR5Cx+0}Ri5!c7#h-Q??_4dHa-G6hL5;@cx0c0E|SiI znwm+HW`2K)S|9DdG7AjE)hPV91KNecriVNd6H)lyQoe67vVWB?M`?iuFTp&N6@0Sy z&Fb=e!^C}G?w`mP4>QbSqg}&oxx01p7$LEIwtwz&<^>@o3^NC<1rGF3H_cJuD{MV- zsgP+5Sxw(TKQDuM{$K=(rZ9;Y9>COadeZ5^6w z9=;>UrQ>F?#y9>;z5zzQa&lo|Gd{-};=wIxtRJ zLR#VY$YIoEC}4D5Tg^*NO%EpjOvukcfU~FXaF#j<{@prxnnh`tbNw=;#6OZV8@?-b zP#=Gk18tRFJqCt}JIq{qI>H=<4M{De4)z{$tD(cKTKCt8u~I*9(tZ*FDe0td@~5xc zXc>pP=F9EgAbCqIa-V+-E`{0|C?$5k7T;o|+9%~~^eerQTRsEqb0fZTg+2;lB_lK3 zsX$%hBdfcR8|ys&0=D#R@L{Vf$w)uKLE?XLdIiitn-e(2W$r3yN&+L5A=lS0eN3Um z)_)0+o^9M3JO@Jjte)d^x*n5c$}v7R!q4YHC{^P44&^%2KLyo!oZ8@f-0!4B%BK&z zYp)6cP_fVs3UjdCbe+mt;>zAAr@KJRZ57#r-nmuMowF-%TIQX zTNh}N2K(GK{2tX^wPFCfW*@pSP=F?Fr%wCtX6*x4VJgzG5ti45ALBT)XXSq{r|H?y~$r2TR$W4{_Qfg23PkN&m452~RpBh-Qb!lIOIs1PXc~kE0ge%EY z=kyh>;5Rh-8EE2nw00%=U3oC~J?{uqiO%yVXb6@%|)&} zIjP+)B%|nG)V9ykSe-Q>Q*-W(+^DyRq5(HU|o$V zGC6sfs#7}AaWPUGM~onFr&^fMA!(+2Hl^n2;F9C3>YBUxuFI`dL%JAz0~bmMT?-|S ziY9iO-(z>+c7Jj7lr>0IA44{TY+e|%iLIvRm1i(X(YaGaD*$Av>=rqD1BhLFG_;$h zDbF>^ZI*9=3Yvd_RWLn3GD1NuLH5=9hsz-D$p>RiJ>ZUUN zlNEgmYalJa+}8fuC)3aiDecOkJ0v@@@`6Sd;HsLdzNAH+< zSOnxiAG&C2bbs? z@yLk>jbSO&HkkmZzM0fF7#$59AiQ~GCYj?U9ARMR%u?sXJHHCOuM?G0(NFb&2~aLW zv1+V3n+HF@8>O$(#0*)ZIN(TRlsow$+2Kh8oYH?v5|vyKawMwWkK~6`+Zs{D42|6E z#C%S=re$~O<}=)XUTn)w~ol1UF0i?@tKovm!;Z>jAM zzpwUY-_MC$EKjz?7fBKo1btKUK{8|7K*+V+4K=9{WK4JcSA*PLdVs7UEJ1LhWJEmM zpMifb@{Zz*?1F8R9oJEvk7yzadCy-;yo$3yTdt#&yppJE$k2Eg>4eI&<@PlxtZI0N z8*H;XsVZPcXWSh=Bk6KgHv&&`*C~Evwy! zCM{Z&FH3oB(3B%luRJ}z(u9Oj9jTMr2utNRujTQ10Cpdii@9xr*Y?YDuJQEKuxg+@ zp${m6!Hwk&VnC2&#(oUt($%U262*Bql>%J``{%poGE0^jv_vsG!nJ19rkdxC!)?RQm9ZeHKM#x}1&6 zQMoaxqzS#MHnLdJs=RsG(JV-iYdb=yp7Qpkras(#SY6$`meX;8kj#I?!nl&e$0wj- zu-=pljnugU73=7s1cvisUs&esx*5M!f$e> z)5>*e9*dw)_e>;;HJ}PA>(da{MeKPqh2HL|94ge_Jr_cSQhflzLih9|mA_>^I9gv_ znY8Qpq@&U32kGvyYaD;B%u^23caJz&tj{-6sly8PZ#CLIbsx1NBO**!%z z&1!0A$Jp7^5}`SjH*8B}$n24EDBa$Dc=H;ZrmG5AKllLnngoCUf*76)4j$gy z5Ru(6AEjR_B&7sDc<9-o*>;G@vPq(#2)=-DD@=q7GmcBP&C<7-`BYOs;B{V;zT*;YejCkWCD%cS%~#=`n_JFix;SKBzN5C0epqMB}y-y4|@o4RiF za*EKV-RH%syg+}h*w3B~JU$0yuiXtu*zUu$MePp7k(NW^J5QxN#_ew;h(r3t?s;Di zD`kNK2%f842%%wvpQ7L~MENQ|h_q*pNH5`(-BV+1l ziL`P0p$)P#YAG^b5=kLoxE^_Q&ERn8+{hNynI^2mndLVW5F^s?Oy%ZG#))B^fuajX zgfyngk({OtN5}{=}vn$ON&IMj^=YthO5rW;ZVv zqR(dKWwL)hqee05o(lP(gsZiRl~HOssrMe16e^J(t!)MA9~?$`0cc4Hd0Qq9!Dzlv zZ7nfi5gVb`mm8JYUB4w{sA*s24Xd^wW2zI@QRwvGt%y`4+p!akallhLWht= zWH~e=MS<4{LNruU0@{o1p#(LTC5%F23h3z`K+=C!Ft^Pb7KL%y#E8dqL{>wfdoudv zMg<@w3_HMNk!MKFJ68QI8J1)hg?J{VszZc~4=qbjok-_dIa=+WD#<8;fj5}!tXBzt zf(^mRusHsLD<+#=gjh5cCJNDVTWubqf^KlDxQyzxQB=)F=mioTq;pXGlUlulA89e z$P>3Op+65Z*xMi>$07$zRxM|gqb3fGPL*YI2zfB&4CeH~rrfMUIbJ1t(4L`HAS+uM zY|28Su*j?`fE<|l@PoH14Sg3eY-&Ra>&C9%Fn%s7+wmz3`I&ECD$S$f!^g^$+|dZmAD z2y3SNuqg~|Gy``89b0Pn;3LSGx$NPAL2Olx?TVgtl=?L~vum45Gc6*Fz1tB`*2uG* zH}wgqIKP^58w*W1wk{^s6^P#i>NNL8S4}V{#H!ELNU|?f8et&AkvT_*oGFBWWfrRe zaA+Vv&6BA#XYoa(cym$J!+jaA#oB+PNBDVD`vPiawP4J7f7+`hcpq4Pskdl7lsSZ? z0jPMQ$y>&*=$!F4?O^JZ>UQ&)D>W3!!W_<B?3}`(>bCoyBD8j%*k>^o0Jq%&u(VjNL9P|{)pk%($_wgyv5rNFjwlmQ9cny7Ll59{k{8e_grrWQet;p7Tvyt9;#%mxop-C z9U#h&>N{vPur!y`26CZJvnUWSc5$-@!IdNkHcZ~w)b4T;AJ2cdZEVWz5L_dM z=KM+0b*96}26PpgpD=suHZz@xLCS{uFs?&qBKFDAqZJGOCH4|It$x?yal;9Ikx^zg zs6aDdd~gmeH9K~Q4pS?vR(3dW(nP)h^$>w`<{3or74k(1(ypr>1d46Uq&-loH#zMl zuiV%}e`-9Ejg_3S??Sh@ia|-oM4r55_Zv1Dq z&Q=-h1a~ zvTN5p`1?(&0gU1N$ovaBNg)We6|=&%R#o2^&A(d@2^($S~4F$1=C|e z_!ho$wR?Y|*Pi^OrVj<-H=U$XwZvcS-k<0_+W;vaRfHOptMw!^l=57!n+7a&E^y=Z zYO?zPIFsW&oTz{D2Vb|Vsy~`dMIi8tn z$&yW5v7gyDMNrFQQyIRS7KsLb|XeeGYhY_q7?FiOYx31(bDJ!}cAx~t#A`m6YnL=JasDq)Z z=>&?_aV&peWM&pHG7hidta(jr@hr+-0|ea&*GT+l!v)_!sKACAr`NDU0C7UjcM zv!>V(Isp?UeNtK#H0ZP4}fhqLymG-sW??e zYy)t*HF(GvW&#du?E-tdmIZe!3FI4Wf~8#Ot#+Diq?|M*JmuZee(r9q6~F0$BWrI2 zUKM|(t5D{b0)n7>(XA=@L5djxrJUp1t+{rYZO~W}n2YQJN=g}369}a%_o_#^F@QEWH?!EboIqRjWP=2?jgYd&4iuXJ0nbE~6TA>=pcp#vSyO+d zs9C}?SA&BCCfh+fMBGae*w15X&`!+~-DZ`r1Qv)0mayI-@e!t9j3lq$K%?GR()k!U-&PHUUOqTbQ-a&3P(ZTpq5)}fu%5P;ftILtJ-_+mo`QKXQT4MLjW zoDr+ITHB&%J6(1BQ3c!-l9A8L)yPfogzQGOd!Q`Axp@{yv_!X!3w!EZ!h4f1^5#oO zQ9mk8EeNJiQNWZIad?v0JF!C$IwVc}hN6SaG9faaMe&<_6xG~fGBUX#(DZ);=CNM^ z6`^)jiB({=3QRfy?t=s+M9sJe305q3`6ctZybTUX3_ML84#}IAbmk4Hj;I5s<(fy{ ziB$+hgwbQR-_F`jjbLQn(BB2fpeut_hXw7j)-67(e@hKOHKtRFIAwhS2K zReJ3Nk_m*9o#F-IBauRi)jEGUxt3sfud>yPOqHxK8cz>)58~fXERblTa$GdrMyc(?>s1a*>fO==$RK~f7WN#sf?Ia>N+|@v zM}b%M%1*^+U6p+ZfNlJ}5jNpoAZU~-jreB8)5>8bXBPhZbI+dLkQRfADUz>RWQ7oj2BPIToQi#E90=b0b zke6p!eNYktL&<-sulpUJ`2aI;(Hj&E9Jn)C#7;{sA~QY&9yK&*-QQ3GF|aEp!%;gf zzMBqI(Q%1!4v3GVsSvKV5ib(I;X4`x$qy@Dg#=15ccnRgS#xc#Q`C1;y$%)?M5^E= z#pO}oR~Oabbu$fEx(GD5s9Ti%Myu{#RO7`aO1yE3c5Z(eRvG4pW1|IK*l4R^v+TCp zn#yT;5!}2?R_?r=!8(iCDWI(fV?kDQ!#uG;Nip}wu|cJ-xa)0CjSHZ*atC@1;cwYd zc-RtZb)XOy4qY`sj504JUb(j8slYjS@WN7uI1d?T!m?#ll49n#Lor$Z8)4fIoU)dM z762_(z+ZpoAy^exOVvIoCom<5B*nPzcv~@cX#!4agEhfXSa)bbEWfR_jt|V)fCN-V z&IB@6oC$hg>GU5B-yEijwU}~nB-IBHF|>#F+QDl#GI71VJqI%YQ1(vl%% z3*(zbR@|uAkZF($pxEz-4u|vr#Z3*j9+r({!C-$$!}u=FWJ^N}tYyWIjiyBl4boY9 zBp87Wt8pX{+~iRZp?J0*$pi)ikzOZVzb>rVHc3tcR!FtH{ElMTD57Ep$_>TUkyBAS z^CFqbi$w6E{h2~WCj($)D#thVO&G7`7ui|jHN}0#_XF0f^aU|%OG}UdN`FeEO3U^7 zN8Eod*%b2iP`i)NOFh25hTv7wrU?n72)CqmGTtm2nCOwbp=Mg~&G=S>up!NnQ+Gna*2;CS?YxFwE^9)tD#im+h%`Na9SJf1jzev_^a(Ix}ZAM*FEv(d25zs zeydsW%1W&CP>Nf%nx^=I9#3H%EaLYBaiL|R_SanC{m}96qy_hq5{ig8D3gnTzPt!4T*8nru4QGD$L2AsyZFNO-xlNuY?FiQdoZ) zgeo|f5k1EcYE<;8-_S)++Pp19^Fga64o3r&AP#aTLoTbMsc5rVDmt8-@*c>x@vo38LNN}JZ$rJ7UJCuPhef8Q9!_KrqKldv7~h-@Hkp>emk_ay z>$SwjoU9v3MN}*~p4O69;AP18S&{{b5FNxfmpN$xBnV5Pwq^+6;)|DMX#p+_bH}K{ z&eVYcR87?am!D|?A|qObuskubF*Di1fVQP~Q3}(`Yyr>{z-DT%2^Ni99$9#`?YN-E;3TuVCoNip9nm!g~C31-AGO%#J zZjnQ9+T&=WcTOu3WcGfjnU(w(xp8buot<+?tUq1IkkrFHBm z-0V>-EWTaw)-=Nqt6{b-EZIa;g9?9FXA@cVv^@$=h)`7PY|mmZEtVl7Yi@vxDR+Z1 zj3C4!u*Oy3#4#j&A~s61PY)tQ9r}`&cATvNYc@{EPN+|MQF%Qr@QJnwL#2)pkdCsw zL(#znC1NBIe}n^jx9SEhKpHZo%ONP*;99fsjGA3co{TYJ0ZyAl1t6@Y>%o7His%5w zUzxyb;s?b<4M&*Lx@DiVO<+^DyHg4^<>iodv*inMR?q9IsLHyt3VTXIOE60{YsH)A z!WTu2%8eG;h!q>QVk|OT6zP&fe<3YUkzjsiA{y6zVp8%8lU7!n`AJGLew{uO=^3QH z!~NYUOV=hNEGEKOq2cgS#WjDgOn-T4oJFEE?j82``@LbIl>|DFaE26u5QqY*Px|{& ze>}=|Wb_w=E#=1?VDm#ESKGXVL90>B9sdgD3e+J|UzncNXD=RbM7VP&cw&tMgNFZ? z%n~eh;C=)KkEz8AE5$iZSOMF7unU;2z4$#@vUj;ns7-hAP3C&(>HvR?g+E8Fysj#l zJ5Lm`T1x!FJ>YDui{$I^%{+$!qjG%H;$@iIh_j!C!@}k`U_Q(ErjZ(SFVy%?k2UcQ zDi$g!Z?lDg%SMRlgd7SUrsyAN^#J-G917asHKzteP<%YbUJl1Jg6v^6hf{#4h^d)e zhsq{9Cp#QDu}j2516F@UjkV^?5ld=`nsO6MYhs7h(i$GA*l`T1%Nk%`6jk@4Z0ZO)gd#ADMAd9wmhfVsxaz(TX<|_@Apqtm zu86u6caL5$h-}HxS{or)y*`B6AsjSHPBnuUy%O24)cUt7#zv{MDU&|YCFQKMG2d)? z%3QO>3${vz=9)NKs;1^_Z|q2hlk6H>xlPwu>=Q-cgG+x=p?Wafp7uw>iR!jD?Op0k z@@qtef9_qr@{2;Je>tb3JKXILqiEb8?%Kas?GJmy?S60HUd0=}JQ`o_3A*-5_0evB zJFl1eXf!yuk|N%YUXI4ma61S4MsK<|ALh89GlF0W)F#vXuXmz{a4B zgVAtw`HWiWtO~k0pOb0L|C)d0%4EN{YfvA{wDyLR9714PBUwv>K{8lOtsoms$9?;V z=2M)H31;9xhJuY1seJ{yO{TeIHDKCy@%imNLwA2#=>q6mNBda9SEE92A9U;|{Lx@*{rtZ0$DGe%l;i$(G~SkRnE%06 z0(&1$?UcbjGJ8p8Dmt~~^1d{g^UHi}rqP6adXyepg;%3XYOD+34zK~k)dXCvvAx1q z<45++=J@{Gf!@{CMTelpUi?Tni_|Mb(*=J$;z!tw`Hg|^7>gd%7fMbG^8fLpm*Yp~ zjIyI9lX^za|NGj9>H3iK)83U?cH8~Su*ozJed%elw zFh1Jf>rLaYb8&NTF-x|RknR{r&y~{KM8qBK-8GkXKRb zmELJFA*bPbZ*cH}G`QODPmOfNkbsB{X)ULlPCuGj2iWfIjrvnNc@oJpr}uwW{IGvD zet0>47(X1x4-LLOELj^hY6k}xg_Yid>!3HBTH9l(ZG)#`?!mWK*4j>Qhpe@V^2P%`EcA#*Z=$w4WZ6t0~cIQveQFDBTz$6 z>NB|}MQK0&T2!z6PSZ0;IG}$%gcjpZ4QYA#o$n+s3rFHK39KK1bZc;ButWl zgnQ#d92@qDK;>w7sW%+htBBxXht3{8dt>%w_T96$X5Y@fE#Q|oW?#*Ioc%ew*|HV? zGW-77e-)m+HhV1fpS}L<*M(=-3;6x<>~Hw_K|1>jet9x`^6b~o-aNaz$EFWy_Gk3^ z4SM(njlWe5@1XRr2KIjq>Y?-5H-%?6R!5<~g|R&mT%KK*p*>F%eC62l^1oU1v z`mK-Jsg`kJYvaj@LLcwS3;7u#$oN~*qu0%LF`x6<0IXUCsTaM1O$*E&{sX-f! zk)Nn(LlFa}Ibwgn5+$2FF|W}p5b^i)^e$y#NH)wUu{zVk?U9H>sHvyA7XNUi&_DTj zKf1aP^^wTGeK9@{kH5;P)xoUq!CFL8Mw-0CByA0tO!d36&?pjF{-1~%G{f4GQ^^tOk6+O z-_NT>g%9<)#LAr4PXJp$f_W+uFGU&E+uX#Aw-(G;PuXHoW*_#_&YV~4ltih%j_sT? zL#y&;v?70Qs&3})1S9t4x)ZE55_iI2e>50Gll}PfrSxT+@5HOXJ6z6pUaeJs0q@5* z?gEH~aCOYpo26KnGnp{&!a1^PS5Lhl{5x5n0k5@i3vlqNW}#3M$rm21E8`J<#JW^~ zCJF`SYW(DKzc3hIgCrkaR%|wHW^CFpnK6bg-I{-+xK}v7)tek-S)w;Q`7s*CPsWo$ z{K%~5ZQYI7v5#*J<3Cy|q+2tuigD`MKheF00q(>{S9{xwuN0DaPX3RaahDl@b0GB2I#hZuZIS z?b!#j`?L4(@2Aaq(H<}>Uy4glnq zfsS}bmK(ChG>VnQV?S)5Ma#_poSAFj+*3*!`-+L*T!(kP!jN#Nd|^Z7_!e$V#Dr(p*xpal(z$ge*KD|14ty4>bS22Id;@P6e zRu2O_Ena7@fJqEln>-9-I2+HcU_eML>FO*K2^*{6sYd-)=IjXE;S;k4-Zo78KA88H zv)^WMO}h7vZ>$x!nvQ<%8Jra;yZXI0L8<8!ZR{KTyH@iye4UT0g8O4g=eQOBcb8lP zl5~*?jdUEQJi69II>(OAK(T)kv!2VQ=Q&Dp*|a>6U}4iM4>F#~rti=0%sx1iNmp=e zUgta-{0a{?6xYIf*T$-mPxLu?H7*zYBfQ$dHAg$EZkBPk!N#kd3T}3s$*XZL%j6LM00i4BH2$pzDRoXBceT=z zbZ9%K*39c~{Fnl&7F;3xBAE!e?6uVmYkoJrnI#JvKoQgr;Us_MI%Z$W!EljLMPGtT zluDwvC!N)F(y*$C&B(`W!AdLja$OdybIVz;yUh#4oY3}h)=3h9ihn_2xBzM!!u)ob zNkG8!T1l_Y$pbtE?rny+gQ3$Hrq2XPMgCGy%DX?C-Jac>y(2m>v@mnPXDJ|OL)wo5 zxfRhra0x^z;0Aw%VmT`u*i?~IINOT=pia59qJFvC@K~v^<|(Z$>9E?yNh%m5$120# z>8AKYOKN8;oF+HBrME&${;rbrz8T`FbK7iCVy8-P7N6w66iru>nkhwPJ{!JHS1yYp zG!mBH5l9$!YNn7l{);Tlqm==Y5Qzkno_xTB_llEK-< zbJ030gq(lfUC+b2Nv-&XhnGMUYN)XeUf*^aN>8EP-TB4s#*x969#n3){%_M(HHAw7r22u zc?M~Yq?R`FRs)%|E4Vw`EN+0avYFxoI(riE2B{{anE?y+Z-aHxy#RtU#1a{meFh^F zA}jWvL*H)bbK=G~RW25p5IaR}bfmJpbS3XYi2T6DC@^YtG19VuKqOh~s5Gn3p&`ip zL!y5s&qSoUgJqsRhp_ulZ0c;67`?(iTU?{a7p|<@Mvkgs$RlzvLxpM}dFqFOQRM?S z@smrfIhq*gETZ#9sAt%LcD9KpuoO2)kBLODxQC7LE*u!|&OV#nrH94I|6K5n@6<%^ zveO>G`X*gvBG}R;h{wm!%63xJ!&+F3Z{UCFBg&SH9yZh;=;&nNZkXsn<6EK*ZFsvMJetAAwN+z|98e@4p!W~Ys3A$}>!>vH; z?`XQLL!E?@p#k0at#-xJ4?we zx#ZPN*jd=VIey?0nj$K}t?KH2rRHquV$_A*4Us~W6cU?*1ax4$Ro%j!40AE5qRU5uwCAry{(}^4MuiGX-b`x3~W@evJy1CEqIFmHG5v2 z!}ANI5O3IYNpXCA%Vp(Gx5+wjSl4)tiDKdE(x)HGL4}R=4#VXp#iYT;=xkkJ#c=NE zjv=CbH2V`DyiYy}+k_sj{L|k-*HW86nofhz%Bko+wlvo`hbJ^Q^b$G#4VU_W0UCcC zffe2%t6P*@q`BrS$$h@Za(j6r?m)KMYmb9^uL4iRZTM5umt{%WIbTwTviVj)pe zkkj!zRaKmMhlCTo!a}IcqO4ORLw}Ax9Ui~&vqEFEza!dl z)SGM{zmaV@vFOsrw{X`%RaU4biucJ8tuCg4Y!@Vvt#FBKH87u_XUl(}kUfBGcMme& z@3c)BmgYNv{Xqf(Rm&r^{6t4|qbE}it@?p#^O^B{D>EwUO2FX}gqR2NE%j8XbY`MF z?wa2|&=rn==Vu6M{>WIWj!^ks^>yh)>cQ(LMqLG8X$y1jr>J*V>;kIZJ81v;>`0Z1 zmFz>byEA)7!Q`v&lJY$FfREVMbc>Hui<^dgfbWR6Ori)r#q6-Q5_QkMw8|EK{Me=#n0 zZETEG!EW0y480H7KM2|(m!z@XHf4TSi~!MOW}$>x3^WT}wZ!P1%Bn4bDoaMORz?{@sX#e<5MBF{Kvq z_PnS6k3G6CwdE^1CkNpx*=Q^Gf3QQ=3EgACwK6!QL*A%bHm@>FNt6Z8_DJJie2R4v=BaWktoDAFW5ZE!h;5E^lk zo~P+mT`wPv!b+T;pClKHAy8?vtx#mi$>riK3y{F}G&4@=UZl&;c(XRv;9gWlDeWd~ zW2`N~LR)a-HtF`WrrD0Y7aAIU7C4N z(@7S`f1QwU2nNCpaoph$5H#R2B9~EIkttA=0Te+%?mG$T>(5ZLGEK1U^twOA_H!;YHL~hk5~1oKJ~g^_qSjF(XXT1W+tar*D9Yr zY26j-!$lh|7d{y^lXGOUH%xuR-Hxwz+NkrJ8>`#3nAGmE<)se~MyS%m?@`Cp(&w7r zOXu(SS8)f2Ka5Z$s5-W-axIZQ7_tGaI91P_lvm^3_%c<`bs&Xf%zQVkeNUpYtk4x7 z6QTczkDioGCJU$4EjU@3lDNc4naxL$72$ID8I9S5x$5@!)9KbaPQNkz|1FLnA3vgz z^R{R)`qHEnPD__FMHUH@@jqb_s5Hkb!9#`$Kb)B+U79Z-uH+U4?YrUNFTIYniR(n? z9x#bi4^9tOnDAYUwd9BVi+tVcADbK7$66M~>9aqORj>4=awfNiB|V(E_hX&&YA`rg z#!u%{IrV?7xH@?_o(bF-8~OBHW4H0kJWum63L0ye=n4Z73hSIdHq+C7nCh*iCNxeW2Tz4gvh-{ zj!J=A&X~%QqaOq+fis2tYazAr^_0rdeJTsVPEyiqmz zB|6nBq{T+vE$u+OwN{0AVUUl*$%Ebo7ay8q6D&6J^5qKz^oZj+tFo})+^C}~g2*Au@^tXu zY}G&3{F8ZGt0fSXZguT@V#|pVsw$gPS9cu0cYeRt+{G6cIc!$io$7E?pVV2eo~$W5 z(!j>{y}_K>x9%1h+MW78|CwXfvSaXwf2wT||GjY9+=89>YAw{*ojwrIa1MU$<0dvC z`W2^nESFLO_H1VjQ;|>A5$cx#*@l87FrbWC6f+Hd(-6r5T7Vi)zYr)eRJb!CzJ=@P z5A!y)b)^+rIdd%yWJ}NR#*G)dhP|F!Wi8E5*gN3+Wv-!HZ5GBd!Xhf4Z}B;&iJt7` z*JfX*8k}TB5sS+C&l-L=YPQXcu#+4XN)11g3ktQLXw`pwI4aoFFIuMS+p2E*y+e)e zI%#3twvi32nJ-m&yx>XW>RBFxl&colg=1qGexovfv>CM%eg)aTCucM6-mqw9KFB8@+7#+SQ&16ol3M%cZ zUptnsITP@grQDA#US>5}ll;+kBiObADfTIx<$fz6o@!rz-ZPQe8rSp@y3q=fZq_f! zygA}a(5<~n)*m&r7M_-#F>4E1POGY&Sk)E}SF|(Xc80me?Wr2GS@|n+Alr>W*Ch4o zcZfUQM*T{VFuv4!;`%$E#HigFKx)OIRQ7h;KX=%^TGqj{HmN6KkstxWzbK)MH)rj5aY5fF*W`waWnrg zH|z;j{;l!b30}&WLWRI9r$0&ggj@3cvgox``;)~?ll8L?D@Fzd)RZ0Ur&DjB76Mze zZa` zh5rK%Ez?(*lwfixkR^QajPK&~+9(60;} zM3rH5Y?Uz@00^4RCfj(D+d3<6cS(15N+?|--6bNOiXe5JF zj#xk23dIP;RKC$6(8-5xS1Xq3zRX%(ZFBEs_Kn>A(OMg0KeRY(m|fv|M4qIyXyg-= zD6jLF-zTI@A)cM(r5>k3W!VdJZYeh(In6gUL=ImVu z`G%lR09~3DPPE3xQ{`^*Ka`2no&0-N4Ee%|+|=G3Sg(14y&i5#*7nGZ_smq+z2q%} z{w-E^X8DBTqt#sZH7!#523bbfro@+a*ZAIcUH1EIKzE&*!xyplh$hc6TW=r{E$He+ zorOz!IQOW&N!1;f2bb2|s*)W)Q!JBGo{iWXXUqg%lKU?lVI5-@E>c>k?*UHS`|9uK zCWd0hae99xXx(vf6Y;~WczDxfzDA6z>B`mW=uvnzo$qUi%~^gAMG7+(IZzxX4(>tl z53J-R04U^06y?OL_)Yqrj-n}dzClT|pd^sDbF!7_UXf;xc z-nNx1Gc+~`iW800-5So$t zH(RwjL*A};TgmH&&;YOQvF;+W76)DV8y*DJ4}epPq{W4|g5B$H$*@pXcw7}i@e}iB zenc~)h$~3B{!#j%F5HgPsyTcvBH-WB8soIR8fJDmEb2({N7810JL>g2J11(d#9<+m zwbs|Vl@A0yk8pfLw$p&(;c0pXNZ9kKwz-ug}gok7~Of`#--fID2+BFFGIO zdcLNe_%+>BBk^GVrSYVO_&{#!;8E_!#c${`G@?bnwsj!vgFo}&A`^&;Mnn&R z98dkd07$qW;giS1;E8IfFwGG#H80LkqtM~tu6g0&xk$;9fg*Th01giB>FM7?ev+xn zA}>+cG0UN}Tn9^pIvP@(-UXu5q@eDhRE7GVgd*jPg~G1FhpT52e3p6XkP7=#wrZNr zooi^|kF5^Q3>)URqorh)bBZ{n1mCu2tiDPCMp5s6#(mLa-9gVl$-f zwJS6^TKl!_Z{zdfe2rWtVvXP4NNW@j;~n`59A?wagu#2@!RiOHDXA;H57l_z0_HW- ziHH=w+L-4aPb#zGN{OV>5@%M1qx57x65_CJGh^5XN?iB%_PQ(FY*PT%_f4se-8 z%U+X*HcoA^8lco_et5PNUGbB#FQ?N;-tvUdlyj1*?R%{|((s$QzVj^t)Ss;eWG=wq z!mDq6(YgDmfL@gx-#jvdqIss!j)wOiAFpB5cj_G52Q>Dg+hi}o!iACizRb}W6jm5& z_WiXAph_#cPhIZ*LRQ|a)z&sfBQj*7gM4fq1lS}_ST)S32uUjh*nb!P8ukf0ZBry3 zGekT}I!P$q7XRb6l-gs+D9Tezkr zSKF<`ZHjEx!d$~{2}Y)RvE$J%kc)~PkeJ%wP};<;EAA*ws9Ric=rm?f=u^mUC%nX8 zjHW5qPeQ}(2K8Q=b~eP<^)Mhs_sLi+360qty?x#tAA1olvxSAEfVs;B_mR)R(sAz1 zpD-`AcLo4Q>|XXA0^@`LT~XG0x9ulw&jZwTHGOMd=fyu3b)p9fNR&nz$`-f`=nBIp z63UWvnwWvr!6EoK_jD|w>%zi?f!SMf++vku#fnuz5jfG2D6L2>Dy^P7grfV-=id^$ zX8Fad>Qg?9()jkzdn=%3qMH{DbvhF?=uHF`gggOO){aqm!Gt>_i>(ulX0zhgeG*eS z%*-d&L!yePnJL}h6&-(1z8I$KgMRO>Qk5@@_ZWY+IR2*wDbql8KYK&1SITc$fJU(Me|xMfZNd4s5}rK3G>-aJ*^Lmf2A>`U zqjT5%I&u&WF3l>Qla%`Zv}9SLsZ08QTatDam6r@b(>Af7T-c6O_sZiiAU+%6UB4Yf z{q9&om~7HI%~qT(LL=zmT5@2=V|y;Vrs`XYt-Bc$+HdX}gTyn=N@4Wdvm0juy3)A1 zA=_?_q-+L?Il{wD7B98;Y1g*8e@nw!l7c6-P;$2olE<4O8YH<@Qje10X-MogUfTx0ZH|WN zlfs^ya(Kr1LfVf?!GA4&P_QF{xv$lO1rv*Aoy(9rg67jo>u>YF_TRR~eb_lvt2}~8 zye{#)=-ex|TN*pJ9al5@l4^#&oCAu`HAKfvguFuHTAVC<(OIMy3Ip6ol8`x?1tV@l zO-5VgSb6PK>1rQ?xNPENNHXrtJC1rjruznxd(_g4$1)3E@&q>jAh;QIC-P^6y_3gA zcLYyPhOH38RrO&J91dS*l~qhVw5P$qr#!bbZ&|-oroy#)GM^J~21qsUO;rg_vby zeAGz_^sY2uIMz9|^lx#?{iZE zg{c=rXyk*zLTRXZ>+&DhP_F?)$i}DFCclCwPL}8fE8cCmP2r$gg)?jlovqO*4F^yB z#60|bO*+GUWWoEGT-$XLzHmv26ejAY-qLhzfu;s8DbeRY=fNX|=h$L^tYBpk&c}RI z%+*iBC(KnIwEo(4?S}LlCd&IdkLPa6jsw)Q)a1KZj%7JP-IU3~n8KrMuLDm3$N2Fm zkE7}bUsNU|5rA6wC8{2ZQLJnkM#%jL4)M}7Pn8)Bz% zjGjHzdh$LbDaxarlrIMP**+g#{Oz-6fI}{HV<0UhtkxVT_CP6BQc9639+E+nY4K}t zC8k54%I1>suns(?XS6h0Z3S-caN}Zm{kUjf-dg{2ybV)Y(RSflD&t3F1p!tb>VFo7{|+LxcD@{{1Si^E~j(J z7;V-H&7di#&E6elv8>_Y+fC`~CA1@3&Lpg2m*RKTg;&CSO z)8ZMk44g;2?ry5^@E>Bgj;X>|S%~m?Tdey9vvNX5)L3$f@dF1N1vm*r_Qk&mbngi6 za9Hi8{WqlI!V!73ipS=P3xLscSNf8(R}WazlRIk3_};8D)EgogEl|aM6&-VZ&F+yTc%i|zRocKVidIq8hNvY!&*G! zy!Rg?rS%{3lUf$P9cr^1+hiw6#kG7Lmo1l4&&@Ul`YPn0KmqoabHdPKBEV9TUZyZM zBYunYuD7Et$jG0M@~zGH7JNhjM~+BBEADUG0mZ zfnMYMC14q!c+Rex3z(vcJ^Ox!rt|x1-7skBO4SE%bbhvHU`*+T^)8A{WGdF3@S#89 z7yXfvI?3b?P(zdK30%oSt)s3Z@9wN_PLu6C^UM|^$?5ZzEy)(&7Qu5DCCeAtbX6@m z=B+uHYc0bUB!^q@9mn)1i)Nk)OeCh>am{O5*aKBr79yia9>llg&!7&B? zCKe$}(l*YuH&0uJX9{f1!qU;@QAMkrHDOdu}n-~6X(ZegeQaAZx~efAqC5`y2`^>E2tHL_LRqsD7h-f zY$7ti?vFpAQgSmLeXWQp2)OcgRT<_y2L(O>4T5Wp4bcgeqvc<<*-OFFbvSzD$Z>LA zihMEki<~Qrd!hBI8+WVjGJNZmj>zDy$=XH@^qAy&VDU<4ZB3Qasn||ep~%$hxPiIk z)Zc-&}3`hSX6=f8@;Tpk*UCz+jp%u z`$R%;GuOx>NL+0a%OD)x&v96He;*#G8K4GC1FZ$v37d!Cgw1%TiG$@gFs*@PHB}cP z?|qH!#3Csjqyqo72g91}J?gnJps_`oWc~XdN@O3)St~MA{PEpI1 zcfKEUnJkJp0;5|iPqg}i=nmHSi)F z<{W#zE^mRdz55pLvzz3FJ!J!0B&Eg6y(TaMU1F(*->(fYD=n8mGbN)qtP#KcJie4( za!_kc&;&x-mQ7ho&cwROiwef(dAvyd+?A^vzuj>A~)IVq!w#Nlu zFe_2hS!bAH0PE!OizSymi!cKOT-)Qzh`;}gQQsvNtu$^gfyQD!9E}}8P1b;rVjXq0 z0#DqBfw9gJ?~}o#Bu`u9SfnE>ms|=EaoLQnJdwFoB$$nt5hZ@&t$7@mW`I>astQ6Q z2lZ!mUsrD=@Wwy&993^M&#@jlSc^{%As)O_VYbGVeXyx-i_J?Fb1 zRNgWFE{6JkgXewV-R9YO*23mw>7&-PjLxo0F!t-c?skfRqD7W=iEKf+Q+qhje(RsW zig_O~IGM>t;}khvDK0=1vHrqx1UU~Q9eyKIPd;1{Szkr=_#-q*%jnK_2ZZ(~wo&MV zB3X(qFR%0y|6C(w3S2Sb)h?5;HEuUttioE(6Z6w#qo&JlQ2m&YE zmq)aOlCh=Ek^FrS52$?qMVjnBSS8ZxRn~&~7>^@h3?h_#MPq5M*WGb{KWwt%Y)-#< z=?hLaNK5(C@7LOqp)Q1sC6}L$L00|!OBGA%Vz~}`I9U3nHbG-lm`18&CcM!t+&08+ zH|lKVw(3?z=QvbaWXSe#Bjc`CLXs3b+fE&-u+ljBZHX z4lvs&16QElSlHn4g(CJ0e*}e%hhdd|3svRdv%RmTeT-8m!}Hj)-L1Hq#VgAu+~(ut zj>TxF8=d{2gig`blrz6*r5{X`U!-t8e@>fT`el9WJSpONq*ImICz1%S4du=Q&;9G2 zc}Go|E%?EXFV~Q) zEEZhWl0JOoRDa+8i2wMS_&#T>Q%zCS6d%LjGkbfHe`c<*+KsbP{=G%SGi}QSMhXhk z-Mf5^r6glvHA9y>1)U8Ce|_g+>Q#xIeUVorMNeqox7y=Ur@(egRZ%fFG3MI>_Q}*f zg;Hy;)YENg7d+E8OY74SEwWZS@#WFd53A919&T*swccyz-}-HqQnR$0_0Vq^qupA3 z`b%U}!YRGZw-D)To2c|5yF9jBVs{B#iJ{k315?SzPsah1CWHHH0h2G2ANmnBLpvR# z6Q)Lge55aN$J_#^gn1q~Y}@F7<&eB=WAnBaf|cSho#iOw0er~cJtNmhkk>qkzy$rB!R7(Q$W}DiGsij2 zn*6dHUvmH8c@l8=>Il!7oW}g$j=+y;?Za=7og- z!D6LJr2foy-%q36c_OE?g_#4g%ZjFn!rvS~&wM#2+n6R1oH2f~BT-u9IE}4@GwRF; z@9S>~o*HK`eAIeOIQX3iM;(dOF&{Sx+e=k)5w6U5CsH4AcBOKXCH= zZ{%N)SP-8h)_+ho2QAF7s{w2erFh`DW;lY z4L{>0Ez$+epW(#;0=QH#rNuolo$RPA8Z8w&tFHcDMLeepD8@L>kCxf}KvDUQuH>wF z6;=@fup+iXBQb6Lp~0@!pmWSdlA<|AB4$qU&x{kh7nhH&Y34RjwhT@=jFj_#e%5 zY}yLBSw-RM>vbtrnk}Z~f-=cGVij(N(^q>usc3QT%f|~$9~!n}!cU@bc_P6v#(@x{ znn~luRYSaGe-Z0c7DA+^e96euMmVdhbyNhNNd#pGf5EPabSxYLa6S zzCZ}x)10kh5jR*gKUW%o320xO@&gxu8?eCE_gKTzV`n9cF#XTH3r-TJWi9k3?V(m> z{vB_>!7+Oa#Rw=8hsDs4A^?*@Ao0Wz$=Cl~9_yL+tG89uFY|+b%*w?n{u`4Jv1_+| z+$yc{PpF2)vnu|b=)5(F403KK?I4)(IXsWja-M6I22>|a%7MPeB<2H`oBQFi3Lf7M z%P1X#p*KTU(E`Mblu?!38PLX!hPK=I;***Ij@t@XkkN+)v^)A^5_rCvrk+hD!H7B4 zd(*$7N&3x{GU4d(-F+n6sJc%6y{<5?^%c;Yz;hu0{ymUDdd0UD&Pca)en_bO@o7x$ z20(>RIrH!?EW2vqvu^Gbfc|_iaRd6`KdOs%9i8*M|AEXv#Fk}(r4~Bpej(e!?l|1l z;EPaiHKfi^c<@M*ia|*6WhFe{#(CI5E~Uoicql>AN2HMR>dMB`wxTJyEeFLUrOH2| zBF4omI7zUU&z`pAL#L~(CYSHnJ%}fBKo}G!Hm4ZRv+MkKf4_)e_q_&?RNj*~?1MbD zuLDy-_aKW~VUf-93_d$sI8XF9IyQE2Nf>eUK6x-q+Xn0M%>HM1b?uM9I0C<61z1lk zmo8Z7wChKJ%C75uO}VIm~(fwjU%$lfr3aFX4}Jv)y~3w zFMSKLX75nCU~>q?7etjBp^dkb`C0hNZnN~}j0cBBzW(Y9NG?it3BB)8V6M@HlrJbw z5)Yrfo-CbP(=@5S`wlj>Vs^fMr2~kn`VxWHsx)+_3V%z@{1TuFFZPX5K8EmXu4694 zn(p`2BLExj9hO^C<-UeN1Ede1r1Y$ zHf&hzuTp{&qLPHJX+L^gREvB)hh4C__v!(9keU?4{%2U|WjTP-$EBs6 zfLQ8>AIRaoACBcb;sa+)%6V>NxqSTwSDInRGyFTAJbD48#E|4M4k_0@D;ONtM&<7p zSpJa*)CeDDm>A@4{2?$u|6!(EHLw96o&ikkzFBt)#aJvGzzRrBy(J(uEgnwyykeFP zi%4NU@O$--w$0*jVLsB!?V{=5ZS$B`U$PhbeG&gh9PPJ%*um7i22*1?os555qED0C z4)eVk=KF6yL={ZKk5)%xlY(>ms&|=-P0#vQ&p0eDgijX>LFy=onK0~ZhF1Zvwc5wz zW~2~TCy0AdN&k(WiQ0E#1Nh*~bCCaB5=0C)J<0Sh_r1>}FC}jNjDan14Y>kG^{euB z>DC|b>mTt)btK#hx64~GbIz^Jqyj1*44S`<;)Wgy;%VsY#^j(uO z-#2oFq}Y|7NHdD(5;y{{3?isv-P5;~3=jRfw?cG$6aJVw_A)PHHW2SsrqsCoA})5# zeXh0M<&@9N!Z@n?1WBIg!8hxeV(Km<9Er6MMt_H?M%ZE3f>`n;%U{FfIMyN>eLKNo z6n&eYKZaYHQ}1~vIL(}$+4dd}Kif=o-m{Q&cHGdtEO*5;HwOvme`o$%`-09ceENJe|+S0^(cz&xJWXO_2 z*X>9!LPDlI#Y`!Y&8Ti3rS$)I0oU#}*DyEKfnB7L$m8h}x;^PT`1S7}_PUr(J#^q* zrbQT1tun8%1*3ZU@Ie4X@KE81@c;F|zenZ&IpNda-1D__C^4^*(@8rU8^~)HY{Sg> zGbCi_(;9GaDjdxpC9Wd&p9M@91*`K#%h;87yL-@=V4x;|W7u%oI)qvr+Twr#v_Mrt zIW*Vv=0IU|9r6?Gr5beSikW2JaPC{2Bk78OIK6geKA5^TORrIut4CHaf<8RSD3^9b zvb(h-@=lhJS|c)*drQ)5Cbsf`e98TH7|m~{1o!<4sCpySD&#_s^;cOF*Mn(cB88-> zS&ybd7MgtO(75`%JQs+p2=08Y-=$P)7Lx*-_LZs&jJb;l4CO|+4Tvg6(7lB|C{CA7 zsHY~#YPyy3j3s9)kDz`>hCx#A;Vm&ZEAuEpD=wNaEAhxME0>L+m1tRoQnwe2cZIrF z8HR`qlEzO$c)BQ^@T@o39UfnbPIBr^=`R7lATcnLO% z+&Za&xhm7C$=+MN4vQcR(riStqN`Bu<`a5_PvTO?FRmGxxs`^e0xx%^|JK{*TyX(2|a+eM88$ zxL=bxd8UF3y)QuUJ@Tvf46hb)$*JX|j8mfjQ6CB`+l(hY9`We;Dtv(%_#+(gXa$Ob zM(P|j0$AxoI?Y5ykHR7oFoN3>-Oh1Jyz9r2;<|!SMM{WmWsZ<%A?#;^(;j`D7NeQ9;7`D zr!#YFRt+lml4EIF_KaolPOZJN&tT@WVWTkn0nEJClql$aHR!&$-a6qp=Dhk; z2yrP9i2YmBMX-`^C<;a%0~lZ?IJ61o00}sT@)j#(FqUXy&BWt3(pEYox7HyY_A@)C zE<_*p-xq?b-|rom@8gf)a=9QQKDVbDJwq?9C*^AnpJy0fiI`s$STuP&`Hy|y^(jO!jvB|`ulhaMg0)F3j>#wHY)Rcd! zm`$cCkr(9iJ!pU}5)7OXlbY}qdZIiP7nD_j4f%Sj*TV>?1J2t1Iq!$yN6B98-QvTgLKkhfx3#4iQo6lKLf>|z$}=Q$X_J2Wf{Xyg&k*A zMojiV9EjV>CSAHv79o0m`kb2UBiYY1L$l1QH2y`Pcl8*^-rKQCs96tdPO5+R{6`Pk z^F_fJAne*EYLJa`5ut82?;g26#-l2VS z)U)J^d(Xh^$W?Zb$!G$NQmmk0>PQFuXR+~SgVT&uwq7!+|z z1ur!dq>A`y1RVJ-o!}v6e(}Vbp-+APH6YCsnUoRqvl0XGcU zUJ20usDJ+J58Ij~noZRW$?RhZzRkv#p=kHc5z?&Z={^MS`vaG3dc@%v>p}geQdms* z0tC%}vQAhXwxHM6sk?9e1H52Ze_sctUC$?LIg8N(MCI2~>kne!Ms5zD-!XGl1vWk_ z`Tj~{e-)#CWkXoQbaP8E==coiI9ONZ3bU@4>guJU(h~YVeGe@&bIMm>z`58{opK@a z*f012_J7ZgtqZsVTuQY{4^Np?@rW4>|Fuo*=xPSb3atqs5_-$s1P_+ri$m^31gV5% zd{NIT%^mF1gnWITH-my6^hK9NqcTt&Qw3Z4Io`Qkb$zo?*c#=tHGs`JIOCmu7mqYD za|_9<|C*$@>!839kgq3V0d5Bg&dr{c03YYz%y2~xmq(=nn3p!rk6Frn@Yy9Nnrm@j zNeBEsR>s~e_KM3Ix63Bur~MTgssA~9rn1TL&~PHZ2&<`!9g{uZr;+U-zrk4}h4kW! zt0Q*Aa)I&KKw&uLax*XWgf`t{lZ|5s44RVz0n2A_5TkZ8+NtS??8Q8BMBqQAH0YJ% zc=V4lRiA_7Mo97%d8C9+|ZFGllcIB&u~$jBK*$5S`#4T%> zi%zh?Gbc+Vj5G*%!J!bQhufiIo%!QSww=(Sk4^Qcpb!jq1f|Ihcr#5x4PZ<51cM*d zAc8O585Y0I{9GallnK0Uhb>2h^|w@!xq8*%r9yi$@?VqADC-J%9GbJBjH&PIJKowr z*GhCgBI?2IUU|366c+zWgHd~3XiAmqxA-f3!25sZzw!8IHH>vhvf zux>>&HU=Q#W-|11d#(nYWnk}KXE)6=G1(Mi}%W zMP_jFY`1}OkcOreo~gPeULIuZKf?O^s(N}cVM8X8rC4>NGO{R(aE#S0G4eVakqr{L zJ>M<=>*$dc=qTOh=)ixE3^#Zn6od_O*(Olt8^3}ftFanH7Hr0pQ3EDr;v-cA^G&BG{1hgj-b;vLLI&CI|(Qve*{Y2ck^ z#m~+&l`)QoI#-fwY*3p#l(L|wI6#^1N>J}gaB4ZkNyZz0l;^ND*K~x&vM#&R)CTR> zl`VA#HKg?~{{#V0$#^UfAqtm2zucW$SeX7-N*|H+{67Ey*JD`YR{iYxXQIKC8Z@yx z!^N3PLI~_QG0)d{4ffr3{rXYj2a(tLeSJf-PbIu21b$a?#bq~)*U8XT0JFM3YVg^c z(8|1H?Hf@%rrnmD#Je1pj>7Pd%w?Vt<}1Y!zJ8;jIgMuOp7NYj?Y<0Z7$42|?da8d zcnpmfSI(ESE*3^oUreT`>9MI`ysBe@XJOqH(V7G*?~FeS9X%;^jvK9`gj}SfsozE= zT5Ctxtf@ShJi**SRQ(Ku)>#AI`QNEm-k;f@--_K zt|lLFJIx|I+&Xf~D|bdT{vb&r5f)|S(w z7zGUISnUCJ49SYj4+>?TiK?9f`@@}{91kxy%aeaAcfR$%85P|XdE+4}fAz?T%euPU8<%)4_BRW^n~4;`DI?T+a_ zbV}JVs4!Saf1?do?v8L!>578{ER)HWxos#Rgw0}jax<>U*%G+sGg^oYXhju26-1d) zr(RH2ujq0=jAGUFe|I7Kw69GL?L0y3tB~32`uT0E`{E9wsz+iGe}hU02;N5} zu;ck6ioS{J{FuMmCseSiq}+LwNH^P*%=qxqAvB$Q(uH1dm$dAAk768!w2al1)3~{~ zMVCFUIzqI;F@JJ^O<^if@Cp&l{Z|_cBmf@MCQhXbKR#et#3xCY@IbQ4p~t}vMSwne*S~i z1u1g8&u)%#H~zlqj@HSD@;OhCayOp$e&$yqECbOT9gHwz^62duyz9YdBIuo)-xHC& ztRFqtltr~5RW$aoy^NN&c==rEe=M1wA1f$#zpeUY!-$MX@`@)hh@ntwo~yy;6EA${+ZwxI(Ti?30#p_f z;f@!^wM|&e@GKQ<50mfs%yaZeu?#lM5-uPC+{8pnMZKsP>!a9s<=PS%bS#)SgCW zVMP~xq1=hCa?5mH{_z~Uy1$)mH(5BgnT7s=`DMI+_Yk`;BijQrh4zywPKF}$4G8Ht z)eZsN(HQmw-@%acXr(h`&J0iX8wIs956UA$YG8Yh%e;1d#qFH;e!4X=S^=%S4h7Gj z;3Ww(9zKKx^0Ni@h`S}*o6m%e{ z#{r`))kex56g)YO*9UNEyY)qMv=O@+HPTw6uDQ(0rno6Q4en9 zF<((>S5=I#apTT-EnYImbqgKXo3k*Kx&yeFRpkrU=6st79BHMSlrd0_%TBG(XT{Vo zm{~^WoD0B?(c%?#jFQmN;w5)G0wR@Qoz?xe??y%oBdotrh|`=%?NvrNGcx#{Rq^B? zn^zfG_Ke8!ggc&E7$}ik8Ag~ekMc#gMm9z{A)i|*9?zLZt;4?p-Aw&`3pqedH{9464?Z`{=T(-~mlcolR z>Gbzo?@6?~at6=gGfSYw_c{8icRu4ggVU>EzkF+6QwnJ!IipdFNq&pOJH|==W^Oaw zf@EZisNdb*hH!dKsBBzdi?Ri?XkOQ;^I+OK8abVBS;MDv5KDRHGHrpNR*8eiOQIb3 zZ%3JtfSuZ?#e-R;-J|&f!fUaf;j9eHo93+edH5j&!V7TT+?}#Pc(2*Y$7C4Sv6#^j z^_n&5(c=&QEPr7H+bFsUd|VgKXUzB+&WKegw@xUcOh$qE2=TV+`rz#q>)Pi{+QP_b zPj6{_n-oHKG3rvlh^3$`+HOFA!b!Evg^t*e@?n;F{hzh6o4Xgp5Z53`5McsRMt1%x z62Np5lswr)!+C=M3+;xv0{p{TOj@-2@-P{Pj5m{rU^>02aGJwDcja{>7N0H!nfEfj zg%Mvhi^`sQALFTiI{#sG@A=dH?y(iy*`2||AR2-x{BIs3ss8(zrR#N)N#|THJCPU4 zt>`L?$TS6~IcaquFKp-4fydUR1KIhexxNbJ-$;3NA5jiL^M_w<5AX86kvb-f#)N8) zVG65=E*LC=rVe4Iq}q}aK3bNq;#R-zq%3ZLvgrN!Wue7mkw`fW;aT8PFEV58efMWZdNFog43(uHE1{p2d-1C(qI>dBB*#_fHF*T2=>|$1q+x z6{$20u`$OIutccmErlaD=!Pz@m|{Y+opq81k^^(um1h4|X4*x!Ft%^+xP-Lywn|Dr z?j@$n=TKY@U24v7*o5ZAtG%2cLKq5TTo!o}Lf|oJtYbsqjn(w_)q9-xCF5L|`m}DTIl&WA9x zVUsXa7RqlKb>|88U!C6dPa}d?o3aGa3Bq(?dkprD;z;)r1@3|R<(N!J}_!v3Z)2@6iBwc~f*|%Q=!m%#Ne=iP(&vj5PS=f(= zkb?tc@W#EED5I$miK>`AUK@eYSJYL;%^h3v8uRB>TkZoU;;`? z3V9?&Zh$a;6Elj7dH<4mbpr8I4l2rUpQnyWN8F_7e3CxnDi$+HOwH(=4?%Ga7nzBZ zJQh)vi7K5DH0%#S4#ZUcyQI8_q&SkiH=2(naRG!m%3bIx2qZ$g0kSWU)#5T5iVga3iZ9r;@RK6+@&}vDEjGA2|l)=YS4(frV>`@B3ULwU6nYKKW}{%*f!VB<4g8 zj%m1v$H=$nqA+LCWdYj@lTr&LNG)Ci<3*tZZ85N+!*3?h{|P8qdj-SV>n$1nwmXsc z4gjTq@HV@5B!GjGq+^u;n%ZnWsBNWiAVKnex~^MW6ni1-s2`q6S>Z%B8ZTZ}md3S~KTJ)S6|8;pkCGpN9#Y9h(M zCxi$qh57x9?f~LPJe8gZU!`styA7YeAoB&O@0SWi!`7 zmQk&LsZUG@J%;-yCIL$1puPx5P!{&)6t8(;1C-ak$Htn`(se1x-zXZSSc3U zU|c~L%;sy2UZiIZpVcWaXN?gbG?CBu3tat%Z$4QY_fcf!AERM@_g3kOjjr-gz$h%c z8PUT)>2wkgyrGiC)4MAfPBq$pz)uMI-e4jM)g%DfVxSQMV+&MGP=oq1DG~U)52*K4 zF1TZptF6Z#VKE`IEJ6YX6VBbK0Q3~KX71~u5Fsh~WY|lC5F)VP1iYG3m5Bj_QN@_i z2`v^roywgSL!a&^kEatbcf7!BiJ?!Hi5IGc8I_1C;FFuTGPm;DN2i$Tot3HX*b7YS zs;cBFx9W9F4?!`tu9OD1OsbHCb=B=O6ocbTxdopDN$lmgzeGnPHN+qgSpcK^x#l`0jo7L64o-_QQ}A%r66$BR~A+c^Y}vxe<^82CshONJ)$ z4HYT!OS>I^6f-|s^q2rzMS0vK?igZFspBsfNi+p0tti0ors~53}NO$BWX zvFX!t)>vEJq4o^iHz^;aj+6yd-MFQ`L|Tu=3XvCn$49Q&G^A7@Uxa8Gr%rALGljwj zGxc9frC(X8JmFxL`aw&8m z#fX%QH!q|$(cPRJYLMh2M^kmMB8d;IB6FI{FbJ;tS%_5$Iz|`#FNJ8Z6k_zesY`Ux z0}l~<&rNG$?eHq)1=$SBy1Q+K#{)zF2~Sv>8<3WLVGz|omj8c)GRe#M9b9$mW<5q2 z|0~rV$?|-oCJig(hh6LTWg4wxm`RvEcxdbktPsjE#1Q!(D}u=D3RZZINha@1X`6;- zGk9fBMj^vu+~;V!lT0jVc$~~e3y$PL@_MgYgDm2>DCYo;6Wu@gs8IG7JjW0s$ z30+G%h-wg?-4M*L-%V@%(os9hy3dwmvZEkvVC8G0@cO2RzoAe$Xe;geq31P^Z13A0 zwKm`C$Ogd457)WPxv&Pg$YZ%+;b7u zwbEuGfmLFHyNI1ao;2#<#Z&C$Nng*HgYKcXm`pY*s-aoBfy$hmR)Bl=wzZhVCI=Ov69l9Eg z6(BD>)R^IAH@B27O$9#L`b``_DT2{eIJ6uHZ}9d2UvCm$x4+SZFS$U7WSi){;adl0 zE?Tdh5$iMvp5v&A0wgB{gV|QgUu*#!#su!Sg00pi3}68^G);9 zl?Uh@RJB`2XH{EgXjaYh8v#oaS^QP zXr6y>ileyF_Y&c*Er&d!6I(wk#!uh{l-hq2FvjV6Mh+M0IMQMUSHTa*U6?Ug_*ET_ zvm9H@Fl?>=9L_>u>#P*~-@9nt*29E$QMk=bnrIcIrswaE_f6~Rnht{m zgVhuDFH4cF1i?R?e!q+JPgGEHprtxuK#OEc&hnvc1KlVl2my`!#proAv~@ucBCj`k zfoKWDaiyRAuPs%_7Y2@XVwqHUM?Yl@-ddS~T&d8yO~3*&K*9t%$atH+{N79#59+-aqYp_~fqH58TH*JxCu{|A~=)>g#+w zN3TY{W-ujOZYrp5T=shW&>ERPUaJO)V>J7j5k|mJ%wWYB;W%>kMgd~LJm(;mJ@Hl> zMOi^>LxEgruT0MVYaAp0tax(VbQAOWX~`ec*TUwzO8^|A-A>si&tR)e%ZEYQF&P4Z ze8-Go8T%#Ljh`8b>TYUq_pW+Il?a3X9~W;P57qnrkB@y~FeMBlJ7wRpMJS;R%5E~U z%_vzzL>OB`mdZBvR6=$}wz7|X>s7Lg?2%nWr0+ewUhl{6@%jBTk2!PBocrA8T=(^S zUf1=!j{ogsVMr0qWJTeoJj5Nt7Tj-jO*uh1luLq3V5a7t;lA6O=8?d#%n7+O%C;i; zoSPCP@8?$SF)x6J+-jC7?2mcz`UNBG057K8Y>;V_Q3k%7Sw;_mWzo!-WDAtY@wVnu*;iP2Ra3R9 zxrpo#`CXM$^B~X|F8TS>Q1GvXpJ2mv%&uDRfxneR*5geZ-eG;w_qVdHD1LAjYgq4| zdgI#H-D{m_IFeakZ#tHwx%M!bIqmnM9Z4>`Qx9)mF?35%@+otKkQKgqSgSS(am~fW zNV#zeIbk3i-B63{wY|Uk&ee^VYA~rUY z34bBg8~xlQ`Mu=b#-TqdkMA~?;w}=qq_w{+REju;43*kMSM@>^(4zTVcA~vfBrZF_ zIlN@k?^L@Gw9A3GeZ+nDnM92##TqxKh@s&{MVoOM=_302YGTfxj2esl)$yBODlBky z%e+GU>pqo=L9r3mr6kR1v@m<-)5w%ZxQ@Yw1>DE@7O%PV7m{2X@_kxptZB!M8vwkW zeQyv;lXvXEFRpjdw>T2GrWfPz{#u{#+%hrHb1z&^{77}&B8`gtv*QMB-P`mQB=^1& zn!^dCZF#|^piP_g)H4PzG_&h&VdJ%rNr0F1`3Vw3J@vrTM((ij5sG3DjPA`EDlI4@ zVJH`E(OP?}=X$DedV)?z2l3I2xSEt|r4UcdYNjHCEZ`;stM-T?$JRtYJe2%t7vTbjhX#O$?U7Oxy!&x3+E91wAX_tHs2F4VP&-(S8qPd`@BzYHtof$GLhRFjsazTc$c4@K0%a;Ik zywpQsS*Fw{VbiC+{ElAHN!Uue7h+$5A_iuY%exkTSlC-(@woBWeQm;oBY6`GwaRN{xQYZGEH%z!qn*p& z$%Km1W*jCcJa|=J2XK<9Wu;MF*D^8xmMs1+>CLDl0zbjeQ<0ul-Zg+Op>8#=c6vi^ zZ}yZw(?f{DuM-U698IrXuTcX>aaIg)S)$=5m#3S%qpigE>XRw4_GLz|9PClux~Z`_ zulAZ&k!~ecJRXJ}S6;1JOK>jGzWFxs(9Nw&Y>*)_?m%6mFuEVjX1~l0h3buHSi1;+ zc1X0bMc`epZENEe&Mjn%Pw>XVp_-E^1Mw@C=-2U0n$TW{B$52wGV_inSLy7n#}jt@ z`6XkFht-9TvU)~e`Qwe@)wxn>YV`L0ybBmi0ibd4%+Ro=@DclnX5JC0xb! z53Ci`7sL1SY?|gr&ci0giJ7!5;IX57WWi&cLC z-AUc{ltw63ifOV&k47vObtnxjR1JN zDZxJ8%`cLXk-)czkzk22PrRNuX~%_kfq;v1_6Ap^9sItPa=FbX!7pcSqIft)+zv%{ zB+5ifPDaMGNRkw}9?fK_rj#_7r+KUDMcOMYd2!Q{1tpfm$l#ZZVkg-^1#Ol#`z<5+ zWhV0MJE=7O5c~Lk=i}z`t`46ndn?zP`{y!7(qmQifImQP=bRxR@qgnFmJ$l@Kylm5 zB^qIuj!r_!4*%e4sb;b+rHozw&%jFM^G?YzQQHIJmwXAJo@fadbh_^u2o*Rp@&4J@XZrw~RKv{rKN2QEywwp3T~X90S*dFOqbWyqnLFVgIdb3J-h|Y=q`qaA0l{#*spb{i zOjk?U;iLAU#g;a8W}kM$3|nt0wpCwjvjj;lhW&-* zLN4a^)o6afbqx-1*`48{>BH`(@+B_}c*A5}q|W|;$;Kx;s7;+5zB%9s7(-&pmE?ZF znE->Zp(-W4BiHq;_-l$69o~B*`E=0k#h6s)tRb}js=}D)0lQEl3l2ejDLwHVj-Pr@ zJ5e9Ujc2(ls_xV{@6p}+YR9^@JWVF8C31%Ixut9%%A3z_UreHL_xRdjrvYnJQEWcX za~ZfFRttmE;z=~)FO|n6??0n0&{1!mx+87`P57pzmq-U^5?%q-9u#Rl1SqmwB=dhEex1y6&MeDxJ+Skd7rzn<5Z zpIZk%4=F#dgsmmalpJ~uI8hEg3JjeY@HjyRkDoVVY0cbepd)|!i8AuEvocI2nTB-d^(~Og-&VW!+zFep?l{!qA=3JH zTtE=9hl+`)HsIF|23zsKu^kaZ?d6PyO|dkos3=z>YCGUb(-&kXAMnabTF@Ulr+~|m z#SCOU8%`}q_C9N%G#}TxIY8)^Vt>y^E4GdekZW;@GHp+-XxcE%gN3BXN|r7HTkFJ_{Fvj zL|V$<=%?4_hS}}N_K0gHUh+(z0kc~IVak2Nk3IpbUrKQ;JhXo9RAK#uZf*^Lqdmdi zl-%OR>9CsaBk$v@aLJ&i`5*LQYFT({dn(5s9wESHo2h5cJ3Rk#=*ELx(+`da_cS;5 z;`7)YxyS`ax!|rTfGLHjtbr-vB#e@omqlsr&G|Q%ODZ^6ugNFBk$>emJ~PZ+IrCt; zx%}wZK zsJd^C8ksUD`N3FT!8C1Qy66d}c3|&pbnRfY$1nDuT~}tAt(^DJ<#&H$XLVGgN@jy) z+%_d1;L~7)xs2m1U=JbPSLRr>YF~zZ9blGCmQ9qFc$umnRlIsZ4^W9`KTou%rMUMc zu&f=5&_HRGd1)aT*HWC%K>!8uhf{6#GatMcIWxC8U+_8M$-S$8=F5_N)T>A`%PLP# zW*y72TR+JUzay`I;nStnZiMaig8iV-tLxpZc(qon|2)-PFIK+sip3tp5kx)c(Qc>$ zx*+XS=X{gs(Y3Mz4-W0;w_hY|{wC=b7 zrxTCx#pfA0JB9FR?7)cHM)VUHap=+GH}t)qs>Hk>mrL&TWG0u^OI#>vAw4*4s*3^P zU8lv;Dl@xq%zG1Gzj+%0a6j1+;@zCo>J%cUzKS#nJ+MqYkw}h7(OD`8+uUIlglf#U z#D)uZdKX_RPm@s945ft0L*b8=>1Z<;5^as)uDk{}o8iU021m_sNtX5`4>_n3n`pSw z&KX5}FUKdtPa&x7j1%cj{;frN2d4+C((BhP0B}f;Fk`nOESKbS*@7v09QPaa`F^Z4Oz*s)|ARB-I#`5UZPNI73!=jJ@o_ zkCmJrmDf31uDS-q%TyKqy#7qKW+0Us<)>><>P6?E=rFqrY17qpH_tB=8^p=FYV>VX zU**2OOg>7cnRtG)4ySzVAN4yMKmKI9*EhQuq2KAXoS%PsNdq6zrk45A%-rCvzW5ic zH+9F2!jcNIXM`rfBza5YT(XF0Mx|)fOW~3%(%Yz)pC9nXzAofem3KhUOdq>*4V%qjGmdFL60xe@xvVhMlcV(I z^NZ(+`X916@L<6&nnuishtHUx9Z0H)1^{oeNYzk+2ufptlN+wgJ8{-j&I)D!_L1kuC22F)g{3`_JkPT(=D`Uy6Sc z1g5z#T=Owq%;_`c(Zsj3v*I+f zlg=$SX=d**M}g=Qrxm-pbuVqHO)fVc_%lUln|Vhk&f;c~Yfl60C*7NBi{8I|xeQ6K?~ebp0E`_0 z#{AME!C9TaIjLh7PnpxT=DuyiYWHZR4l6;IESLhqQvy{(%6%GE4KDGxPYTe++#S18 z!oN@ayw16wC24+39Cbwp@gxe`viSBjEDSj!%or0+T0~{Bq7-hD;LpxUvM_$PLixV_ zs2Jv%F9&fyPv3m^Z4&8JBC|g}8&a=ub9>Xo0nppciDkAUCGPNP&gT}J4}0(MeYM<~ zuh@U6UJz;`1kxH!iyGLfbC4JX(jxK*`XEJskAE~*Jw1%*4XSFfLr zSO`sGUosH7V(~L$>fZu)fH%`Jn#81?i(GAFm&d+X;p zaenCqJt;1D#)pLKC-G73TxbQ+M$@s(Tw|?b4U}BH4t<+k<*z#>TdjRIDhBjzbxe^x zdG&Ps93y$BL#ei;ucdc71`Yx%xCm`qti&#U1G{}>z;d0)yG=dosL^|F?8hW>Y3Q6d zqBMSVHTC?p(9uBRg$y`Xd~NC@U~{!JQA4*M&*%#)WrLSbF!C!+^Xu)NO{BV4F#c>< z#itP*gfyXVQ_B`9nhgPe4ZH}ccxFuOrK#x3J5L*8g`N0epcUxa(t8ed(n}4=Uri^2 zwjJMqd=v2uN< zdJ)OL-W6h1igt=NINO)k`=ZO|GS=I|4^q)(gs!D&n>}l|eE;O*e%~HrLt&2FC7B_c zXdEt$8J=-H#g7q8OZsOU#9{eR#FkY{65nKkmILfJL*AIBP3CBkYD+HL{WOipPh-d| zfsud|hr7SwA2oOv8wCiADoTy=y?8wIZ)M|U*ffDLu>GNg`QX=yJFo!bi;ds5EhDDJ z86#(t1DM}ip(R)wKIMxICjWC7I6^b^hd3lX=Ty}jH1Srm!xkSM5Z9T3S9llC(Q7M? zBrI+u^0xVFywQrlz`;Sdi0JluZW< z;QommG&Wz-*5N$L#IJ{&mQX2@u=6VRc6{>hA6)-r4I};$M9RC%y^43!_38iEB_)l% z(S3Ne>)b;I*;hJBxyr5hsNfk6npx|c+a5A@$n1oSiBrYk(kg!Jk5Br|1xil)r|2~* zSYjHub#w~fSpAV2L%O;3acx^CZiSj)OzY0^ooiQA91~+o)fm<36m!wiD2z2_-l5Tv z*1ue^y6#9a={s(h)^Ah@egxR8qvQe$D?ldH@cm%ru{u}#O}sYF)F~KW=$dh!DN14b zAY}@*l>g(iujKDvrm?x5dLBMP3KsYh3uK8^0U zO`VC4Vd0%v3#_j>g>v-vAZQx2e;Rf0LOFuMTIkOB%_4c~fx*ajr9&UC?KghZPr6q+ zU-ztdT~0Jy@WC53-6{3u|7tbe!vX|+z0MKYHpFmZh^fqlvO1@T5J%Ecgur^LWTJiB z88<2UcWq}9aq4H+Q(a9Ta0#s`MQ$LcZl`T8>9W+TBgJn3Td8|VjXhw*?1=1@4vju^ zTTL=gtXDx^q?seEn4;*~;;QYeG}I$Ad7C%a6Xo$&@L%09Fkc<>YJ<=(x{fbEeBX7^ zV#}YXUq9JG<%JaQa(lyXxx&$_)bIkB*uOtOY6j)H*1EK6gu=h*j@W@*fsI+l!L20q zF!y{^`9yq6=?`c9#M2LK??`>SXtCl?6tBnZu{JQX|4=gfN1{E6hpHiaL;K%M1O7$L z%djb<&KKZhQ{rZjzL*9-mmXqbA+I{j<& z>q`l&b*VfLkm6rKw!%{30{fJ%WAnrfDi3YCdS>=j-*>F<&v3r@k==In3ql{|akKr(&tbkdv!&0ap z#>*W@iQE&Fz#pDz_G~!U{j1g(F_rh~L*4pL#$Hgjd5x?j>#Nmt8uF(CuNc{*RvIRP z0_ymP$AJ{^o|G8>#xwIS4>7D?FnmUQF24lC==W+@v7hT`;O>)WY5fA|ThDOW*9w8W zS#j}4`k9V1TANBG!2>$k@X2L1+TQjaqAKubVw!Duf&E7@^evsy7tTslGkJuaD;`S6 zWtpPrTTIL!6sk2x!NO2DP<-bH6>0EaE?Pe2?d^%9t0*py@GgmB|k z;x1b-_@~>O7nbU;T`bHm|7*^Ft+{Y^EJg9Sr1;Y{~H?I%P1r(ChyA4nU5(o_XF-eM&J-!N8++c8#QJGm>?htYWV+)_NSXg#^c(8NGhF*hr6(Fec=Gc^ zliG$9{;Fu>Y`By&110&l2~2&zsza&juw|ovRRtc{j_lSC-Y*d!P9n}KB=&Pz3INJ} zyH14Gl8ZKlnE~WebUA44oY#_&Xf2RF(egCkqV5j=V%Wi>*}+d6Ghx0bLXEeN2bRuX zU-^|pKt|+lpxlYHt=s%Pi@qQqiaDMKiO{u#QoDVpfTOk6t>x|uV-{)0zf4cRC-zGk zScvC59vRB0OS&NIX^9@&pTglhE~l9HYRhofacC)_-4U10S)h3(j*w_Ha;>D@kDLFy z&i4o_oLtve0LjxzDed?&$cORqIm^)({1tYa|~k9^c?%P+rgX0V~&L=rokCa>41IElHRq0uKaq1LPcl`T-I54yZLkko5?Dr{j!rq1sa zZ7=IBrMnS!@f8=b0#;iGUwQ@(QpNmI^xy;URG=I?x$cP1##Ej;B{fn*?}>~7NK0CZ zNg%~X-SBU;fPnzN=jG>wIaYc$afi+mDPHUL23r52NN}B3Vb*EO#Oo3BXC<>XaMWF- z_#0rN)i1-w|G$mG)bmLfqKq8vCTfL8Uj-O&ZJ(u`(3P;8xDo26O;`P)hcf`4!`GbZud|@<(Jqr+BLD5 zliFJ0>GpR#k2^B11)QsfnSD~p%oF(h|2BMi5i`{v5tI6k+Uxny+AgK7>QT3>7%KN1 zRLDe~W>-*S1^-VcHy(b=%x99P!!X7bhPv)Lt|V80k|`0B;Ew)_o?tmsHu@ubgz4u& zaDj1l?J_(qz&S>kB#pkpd&_mX`JC`l)6!bsiKDCQbgdpcdOEA-V-_)~YaId*tu(+D zr^f}B*AuM~_3FtSYG0&HI0dNMPrqLjvA2|}zA8vlcGDH7nU>*7<8kz)kMpxb%!bZ4 z^OzE=Q=&pRG|B#M#c%iU3RS7Ln4!5^0~k@ldBS z_(!J)c1z;uC~nmcIb`$1-__5*ZN9kvfns!YD#nQ{#q}(j({F$-0@McY$n+}bRyhx> z<%XCUR@)tfcgsdg^scZGRuijqZ%89GuTIP2qkFmTiz2-^`^tXCXoPtMWKRF!NSQR{ zi5hZ>p`vdSEXq~O8($AODR+?C>w8j0_$*9z^2W*A|CUi|3n8_cl7r5$U}OsIG+`yD zAocXn)yX@n-rp12X2v-l*(tJY#8w}jw69T8kglWW^hI7|_(F)@lt`J>DAxMvD z*8E2nTr)LEM!vzcP+|umQxF~$@Ak^$o=h?5(Qdh19&)cIO@Sh!h=)-kP2fNMc^}&5WRC~%aH!M@;Gx;myv4Kr^9iz3 z$AV(o)u`gkKU8EvM7)vzys^It8OiO$OjFCIVnVOiuxpAyiZF5k~Nk?wT&O zYf|?Yn_%3t#gFHT_SD5ktgf_TjQj;50@k=oRJ9qBHRE)C$wOrt$?cQelja;k9M8-x z_V8!?&{@~-xa@ix;pA9pu*u0b{um3Er5ot=r_>*OKL%{q_6A$3`>Q&A{<4ske$F@Y zO{!%C>}rvWDNakA~p=IsTk3vYGe<;u6FY6V_e^I~lU0z+j>{+7>zV7qmR7uv^B-1+xi%w}>TDdWv_l86F+U6aJ zUv!R=0xzAq^KTGn<(gAb8p8&l)f@rFYK69}jJ4+w?3O2zP?}n`-b@A(pQ|JkHAE%! zu7{M@`PN;gji@R8k~9ZuewwFfmCYcMg{m?qnpehtyK{XMx%j?m(NEnUFZuqOPL+*H zpg=H-73Y}P2Q50^`nux|BOa(FiJ?bKJ`{z3dx ze$i=A${`Z>j_E(#sD4R3L16rE!$LAwEahpdTaFyS$gcpdCJ50{F?Yk=&<4}a0BJ`4 z9-D1RSKTT3PA9Xd4;n(j!2ciWjiwhCzub6BR~3hsxcncGxyRLs;V&(oh_m<~yn?e- zbsE&^)E8!YT`qa&hEo_K!rYM~5!So&`c>uKiw0tsO8vd+vYEd{J1QF9GZu88W3jWu zymh(7_5d08Hx{zibMH~yY6d9yVCY%QNmzqm#!e0-FuTd=>%+dM)@}H_o{Qub%ipyo zoc1KtqH(k3WN}46&v2Du5RAHPvL*9C7_?nUEB^_x1%|fU4M-pzL`hp(hOybHYavCH zwn)G-FgC+g!R1_4>+nwzztJlT6*0f0~Fv)7*Q(JP-*ctHB{OCbQn?`QYzj! zEVy+Urn?7Gi5ZA$@d`&tZ!&xp7y5XE!!^})V3q#T{(%}S$if;&? z9)}%-%<|U+UlToH<{~BOeeOYQK8QiH4dUW=6 z;i_j8;KN9%_O+}fD)QZ?q|ftQLyq=(eAI=)(RBfWfSn!1$aYRz)5DG1l}Pz$Y@W?lZQk+qbm ze=m|w0a_>wH8QNeOA(bU^|BMzbiKtuaLL8z zwcrCwj8i@N3tK{U54|o{GQ*XUj@M6QuDi4F{r4-@DDU7+Lyvpi?Vq(U*==>M8cZPj z<*fped!-p-Mp}WD>c8mLE$?03ZlG>sX1`bak{ZYs!gQ(@$7(1kFxxUXFdT@o87=rZ z5Lx&^iv475wGQo*pUBPi)taM|p*0^xMoYv;@*f~Z9)x3XaGnhTijZnU0El7tQXc_v2hxwdNZ12PXpfUP zdl3j%r2VyJ@x{{SedW;RPgT1ng#!jkOEK(}w0r4gQ0jAJG$!KSx`!er>r8<{Qh$gJ z9^=|I9t;YiUUhFyM=fxqBvDnMy;OxmYN_C`rcHiOO(0I1XBJ|jfXt=am_G9`uL?`4 z8w_fP+Aoi%GpHy$mPJWVm&pP>e(89~Ob334pQT91GCD*p?ov6o*GB|xhCoWyZ+N}J z{C0kX-SV#lc_>)b;Yd)}NSHLQPrwiW&b&=dk0Qdt+D~&ovh$wzLUYh& z2&KqaL6uC;S-Slj+AXm_TOD56cz+Hl?~0CRZguL$Nu7soNY))mT^g0F!zYE7qrHF> z7#Mzs5+Zmel#Z-SGvDlL<@yFwO$UTfwh0%UPJwEFjNJLWKY(47mee`HDYkXUPU!dO zouvVVR70-8PylpVuI^?mJp3H!3R0*Qmdq1R8x`-Ca57i66%bJmmbTry29YR}QLK0H zIHclj^~G6He!P+Gx{Q?gJB=}^2_2oLW>^0sEn&rcUhud;VZ70Ptgf}(dWB5#C;!9!D_YRsdg?io{OAu&U zk`lgy9JzybT5=86qgZi3Uor!Bb7UB^{Bz)D#$w=5lO-3|*Wb+tFG!RG5gmE!_dz!{ z-{nch2XP78O52+@hoI+SiXQ!I+wgrO_Vcf)!*=`|*8$HTrnrep6!nbbagTVl_V7v2 zn<9bV{qYZI7RasgrrsRJt{Rx`v69s68tk6qT}Y9u&SO*jL^BL7rldG8)cOR}aGTTAb-YZ-m*4oUSR1bpKyp=+y2+MAvV#0BZcdgPx6 zcQ)e_JWyVHmSj>iLn1-OaqRQyo!}jZs*%DR8O5b@KVx(QGS3xpO0m4??IDy&OC;V+ zzJ{o36nPV2oSa;_h}qjW3~&B%?fBE{fS?|i4QO$Jd+>tE=H7SBpDM3Zj1pmnv+ znWNER8zd6#G!A#7u~&c35U1z|#sk~Alb>*M&5uL(Cgp>*U-SsFz-i3)@cZmx&5qKY z;@4Ir^=5QRrSFLugabL!EW;mBZ;+ z^o(B8+sR-f-qe`%?s%@tQ*%yU*aNYRt*q{NbFTW%{`szDC0Isxe9K=~cpZrM-n-vb z0c#Wt=e+Vm8)!8jkJO`7Y#0srRsg&a&DRRd^SXs8}IH$op$Rt$T$sQCE3V8$oLP}_KBv_{>P{ z;EqJ~qu8VIAe{Ko+7V$Dh`?7f`5T8yOHdX)1+D|m%MX*YyllE7hj;exh?_*C*PP|O zTI7U|i%DW<(qzPuq+h$=ZK}ESPj)prPp9rK&6Lh^Y1#(bwQLG#bf zjJH*lb?sh*36wpQM}Ve)2%RdtG*$C^3r7H5!T`D;lQ)9y7BpL`M~i(yY`S4i1^5~1 z9!G<8A4uahDQGUe9Z z6S?(BUtC;k(z4uWiM$h{&h}CFz`|$4ugRq)BkG^EaNc>wFD!4WiJ-n(<4%ut3ZDqp z=@8>R++c3Pfr&z91)O8){?ZbF7waKn!dDXMk)G>T-W+5ebS)q z&0-|a24K7eI4Jtdr}h*bN)d}4Vk~^7Ui%fm;A=&6gay3|xv?M~RP7F#;SAok+kY0> z>d*BjyUKea8KYXdR)+Wm;ln4GV=HL+Xe_2TQZ(UvTRD^^ zn)irB?h~S!UD7X=uQSQBGlfs`eo722JAj}SSQ|f8eNSIdJ7(IB;R#%LxrA{F0W`HG z&OY4U*|q;d5Mo`Oji5%RC#xL_XVa6bxL9y;O(KAJ^+rl+gIg{mfFKT6EB~S+*Sy`O zB8c>6t!uW_;0tRzOXVd=B6v6qRIE!{%6-<}Ih`Q%EMmA?fn3SSAY!KDK?smMv9kAi zBRDo3`#(OikI(X^0`goWsf`cB;6zq`hi7}g6O064Bl*UnY-PAvAXw))0iMdcF;G?D z^D~}>9x+uXmUc~)1vM?>%-veP&*#_!QViZtXn`F(q`4`Z>E5GI z2c1Y|qv8Phj6o?TIk3`*!$yxU08(1&av@AS!#fQ$5satGoh0Dq4DaEWK-t)Ioxm_F zE|f-mQr$C9$3yJ^l30Rxe%(E2TUsIwr6Ox%$4~sC<=6ub27>___QmzixVAd)&MW}z zS$WgFu(kc&(${WcgHLa&BugEH-zr#5GM%mJu63_^aBq)k5p%0)Xt)Cwyxrp? z({Mh8Io*4x?Hoi@QS{Z!v)w?61K3@{eSRfnX^*~#IV4ri=)aPg)1lxtZdijHa=x2k z{#wr8c~O#czbxQ@J|2wyYEPdj46Dai4q*8+{R99%$f44*f;Fxs!$UXw>6Y=I;~diG zf6@YO4_%^)xJct_hMz1NT8kVKGL9xixMJLcx`GPwSlp;BVEI z?ozsKuvP3(p@}Oq+lFWRLp+bf9=9&`<*sJ*EKYu=YyC9-uE3lT585NWbF3`tPSMya zd?Dq_Jd}rn=cOv3HCkV1s5&?e*mGvl6}W|mw8b(1B!U%`y|qR&>oEDCPt&`OgWBGE zk<@b{!fyamsu$H-#RX^ibP4PSw6beay^}6Nr@G-HKfKYOpW#)xit)iI8cNUr0!I)A z*1Qy?R#7$s)e@>Q6^q>RhUcaf{Eq2(T1R}Z@kAxX+IlJ|-pZgJQX}&^y zVTm=B4rm@(tv!;YpB|`fDI33c(u(TA?al?;6CwRidL8NbM^|hAz3v^*2~*wBA2 zwqCQ^onL+QT>d@hkltaEEGs9v;6a+~r1{&$Duiowz4BLO%VyE7d`?_modwYBy>8(MWjrHmzu0DrmY0?mS&N zye*L|=0w7HD74Q%_3YnZ1V?!_^q&UpM^u!*=_@;>cYpGC$a8k7TN(ltlImWivmfy7 z1}aXqu@1rWXN<~=2`B_ZIq13}aZCFTC3X*txD;GW81}sCaG{mNC4G%gGGiv;JDZgS zS%jCd*Qpk}!c5fh9XLTt`7Wj`>A{?$S|&#Apor0@OX#xlOkosG?Ds#drh9;y}ox-7FtPz5*IY(m(Vg2x-=s-KA!5@s4(U;pxE;; z*)R>cZwKDf5BX(`TQb-Q1k21L>4V=Gcp>4!O0Ephyfrd6f&OI_RRZkK zRclq3fP~dOEg1h$K;13yx z+K-ALQeS!6vv)B*)RWc)&cU~kIemuT)fYwd4&NMh7qgTJEe9f2_V4_X^w-8JHw|&0 zcQ_)3-2G|OLHlOSTR6w}98A`evu@RX1z%*x61-1=osUm|q(M#6FQLT#x_(wdzk9*` z7sE9?tccRM7QE+}t{@O>YpHBD5c#`YkL{7p0>oNNdP6Q3UM(9j3C7AZmdvTB0`P~~8OBaITqK##F?n*C^jgvhbb zve$p`O9sN>0E8R2`%LM5Kx>0+Tc8#@l=y0ib+k}y_Hb1H3i4oLcq&NmgJS3J zpw(-j4h|aKnbE_{EnP~qDT7wUKoGekN*m)MFZzv=$zY9!*vFS-v>w~-&$PTHwvsN2 zu||a28<$i;K4Vd(F+f_bmP-)?<6#R{5D=DKVMh=fj2s(3*;B9+V}5#eiTQ*ma^$VE z{b==-1puCIC^L)u~}Dg zB{9Kh`)rexc~dq0A1vzF+1A-5->WXHhwyUWd;7*K&#ff`CDH2}KVH_Ees3s9v&y1CG@R4YVBFYkdxq zJs15>X%=Fx7`FBzq;cTABiq-R$cyd^-1EK$dK^ctD{vg9U88E01BL5qP8o{CG)^8?!5A*x6+#K`Ua2U8&{+JC)%H|;WIsVpmVio&=q7@C z(a;yXIB#W@60AL&jq9P-b|KHhZ~g|)|MIuV13FpPV@!G{;NRY*1j-c`2ZhaKX{O+N zDNdK;B4vtPrD#;DW=cM^8Ej;jEQ8wyCZs9Oj2|Yid@!dhT_rz>Y0WlDqrjgG6-lM3 zOp$k>K_af3jp8Zr1hpp6*OraiL4eQRAwXe4e(WqlcQ1SM=z~=Dy;b+<*1?I$vZZ2PQImuTc8r)LT3q z)$OcYOU0&N{O!P6lmj$5vq*pvaexSnoO9UM4w;azg|kt_ z5V|lm&C_838mr)-2eYf^EL68zK&6rIach>*CD1jNdzn4#?_}V3pn(`Vd1+HFW*zH` zPNji^?yttzfH~y_7Ldzt`oyOQGJ>`+PAs|nfrq#BDR60y7DCPC2&;txM2e6LYwB)$05c?f)6MwZ} zWif#loS6x8_{#ajY9%MS)3A-ecRWFVAwK|cgnZQJCXlzV@dtYMFL|*FVEqnewWsu? z2!g3wmbEC1C4fM$4s&oUzyj`t&P#BdjWpYIVeCWppKJ^S;BU!Uwh;2-VD4iB9twKq zR>+}VXg#<+IP`v#;?$>T>?@ZO@IDlF{(ensKW&RK;^~;r?TTD^&}TK~vwJ~3QA#zM z-&NG|qCh+7gd&N7^8o=T*gKJIH|qMXzat*h*&l;Cdu&0bF1T(Hvf{m3p>TTz z^0wM3iqIeHuK^yl%VSc?05;I}-|IGSzei|)!^ZVgaw5&JV@y_V0U8ew~Hr;;YfHP8a$R7llEQn4b_UOqEGKV{@D> zwCQ>g^|T|)7qn~nWCC@g151D1B(1IYH?K#~#<<&IWn4aW1@wXK{?=ZhS80{PrF&JH zfu;_W@R}{@-Ac|@S9fp(15{W!yZ`0Dd-tZCGkx$}3YEuks*4SV6dzBPW#J7K z`F57T+Fx3!awzP1G~H{8+UvoI@O@kc`plSp>&ZGJ$Bmn39!{GC-6_yWj}G5=P~5(T zbL7wnYV75mQT`KaTg+KsksUv6W_Q&wfe6*NX2zQ z-L6YfNSbL^%kOsEki_O|t}yr4s&*r>wXyxpMY@;>&u>8i{CJ>T)R>fPG;N^zV7{Qz zON0e4q+y{78+Igtni=Zy1JB(&>clv-GEFmx^6eBx~jL>Oi0xDHDYUI|+x)WXyg1pw_oo-p&}A99|$_brlLM#0rarGJ%EY zg~BTW(^vi{X-?8m$>|I1-w2>L-3!2OW~CyHCNSUukL#3Gh6|95b*1app~MG#9dL}HU@j-2)3B#Bs1p@gpJat$ zMNJk)Th85DR&KQ>GwvjT>va6E3}!Hy*77k=v^Rv3ezC8b(SP*5t9+(M3bZhEl7LhF z_t7Aw;}nQwCo=A_7!>^JHDyN{Rp`IYB8`^;kKlMJ9HfH)-r`UkN*1)}fx$lU2! zRi?Dkd*z6M=VM>H?eS^RvYGS39kqWr-=ytN@J)$VwwtP;MJO zh5L}d3y4>qma7GZ!~$x#3b}M`A7ECXTOu~2-Lj`x5uPDO%r}7C)1z;TyNz!Jtv3ju zf|@RGo9R%vMCmgG5gAgP@`@Z#iJ-{6dj-t0EJA9wB!OsK>!0) zfT+6fdw6IRkP)Rp8U==tkP;+BR8pn8L!?7WA~i#!A|MTe#L!4LqLg%pNFxpJ z8K2Mh_x|CPnL9JL&e>=0wbx#IAqm0OMI^}0S848x2{mtNg}Q$48dc0zrt%=3SWq*` z9p~SRN|Br|1eqf@>rV|bl3>*lyzO|kfpeEzz`jUnN!1kCZg8e1`7b(t{E!2njc;+i z)>!=h=Km}li+)~oHbeJ5H_VVl;+>xH>&E0J#bT zZ!f8QZp4um6!ya!j=mGsM`@EbXc5(A!9NYTt-L-?lG_B*W>+bBbyf%L)U^EKd@^rA z>V1wFiLzT;b|^#CLjs%CsFD2Z3SCvz=%4lMh4}Vzxf;{rwf2u<-$0q?lc! zBXGGZ^A0^C5--=zr5NqLy6OWeN_HrHK}8(p8xu=Lzlb<{0FioJhtW(Itm_Au#`Jn$ zxeNfwNrY4oNUu$>BbCls=|o@gHwXc;d61dgtSifv?<0m)&_q2U@b!%`6U<=QU38=X z1#fE8Z(p(iNVh9mkCoJ6NUqYz?wEYOUR4@R}1r$js_~U$H$3k=sg0^zJZt%$e1ko zGU>u2p2e2)0I%f_MHCc)vk$g zc;Us2{xPTm)Y;&G(jW-kBH!$RstW2&`PqOQK8hna@IQ0BEH;)ZVg?YI!W6N+^x1Af z`3)qcJd)xBH?Og4|IKSHmd=uU?j181ZTdm8<{gT5bgoy2rfsKPfdhUyq?Dw>o)g54F&R z6U0Aan~J|aYH^Gn5#kZ#Es@(dy}pb zn(oh=f4aXl9L;Cb_WC=hcPj@o=4-+q7~I~^aM;yPXRKP!jJR3sBD3LLm1fQ7RAJ)g zrLT+Op>z{a42ZbDoZbSDrz6hSRJWjltNS(x%QQ9?{DDjf&(&SBu-1o+Zgaj*$3$e< zK_G=yNy2kk{wQ1fa=zX*-WM6OSxCk>ZE$s82xCPHw)E;c+u36II1f`m8 z***SMyH8oC?z%00WoHG?jaFF}VXQv}hXEsA#z`MGlyp)q%#OrGfSg5t6(#0~!+I?{ zKY&6`gPkG#7WT~Z%m+a30eky;SpIsg<@cMoSw%(2idzA7sPo^d&q7Ec?Q2<5y_Vo$ zrd87JOl}q5wuV3PE!Q>TqID5BKsqf5ji|B5NOX6b9VX#L$odLDxFTS97U!x$N}l4K z0P;2p6$>du0FmOnqHH1WNCu#!X%wP`5L8I(y#Z@sQGm02tNN#pAUAO&YEzF>7+g{z zGPQ&*KJY=I)-Y#>5Xx%Is<9=^&;#L#1NQD+3E1qtEaC6;QmyMP*$kicSnO@Gtv?-& zmD?&?32h-#`EF^(+AlTG9axVa;83VHSkI(=erb;e8fwzEs zhat!F0sL)H;Bf@^##{NHb=9Vh2u;i!h*+0%I%j)Z7Zoa3eE8go4|WI$Ow%?#Hx8%P zqX|kYtGO0G5N%QCzvxZ4br^2nnK}FaPCbLpx7FSNgMSTJPb)kK|4_7=xL%8>-pVbc z10ce`l;V1AHDM**t`bl1ync7`AH`g596S)of5)n8_!V;v7C00au?d5VK5>le05P7o zEBXa0{@xm^y|ux{2Lj;H02MYuv$6$OMk>-2E_9YXD|j#L~ou|VXz0Sikg~( z3O%^lFQn(aWanVt!G0*lZE<9k_nqdG2Kb^V^rXq_<_h_}Es6F(&OQ0|ii10aPit%PAT;l9 zyxmiDBtldVVAuX2lb9&1EIvR>XACa06>QoKci@$HSzFQ40F}r-S|Nb{OpclW9T^fw zY7!v3Age1?Rz6i_h2auw4=lOsYz2jMh7{ZgF>{;2yr2jf3gF9s!LH-eJVnL^t=nyHk@O~*{`JFp@*6U?1>Gv0eC>~d_>EA1&7x6K2g$P4rvvt zu~vtHH8rP<7`XLrSVG`JyNHwVn(7|cTSr|5N@Tg~HUXfjr}t=y>k96={&zG_&U;?} zPT_NseW%eBSP4q$1yn8LDD>`;H!n3>Ei#a&5TMKc3yS9~R98{WB~{iVcZ$qFlnK`+ zL!J}ks)Po^iOp7zlc^u#^u!F+!T|rp$rz*(hocB+NLhquwM*3pn+PE@!It5k=cNpy z*N~O#Kuv6vTo*1%i;M`B8#Syd_zr+~Rr=4e07eI*bwA>*B}gM)dZ^AbfMjNl3|RIU z-Fm@=iJDc}YgN=2>zNWZ&!s0!B7jI2xGWG77cz2y5L}Oiq<*F4Nhcu>dA@`On#w$b z-&-3G6xnq`O7|HUF@AKxIQ#gP7)QiEp!nZZ`Nzc89!f2`153$FAmfHTtiY@C>mRay z{5al%T_19S(IA$5|KM-^Ah>!8!a;4949sT`;zo8CAOuHys-)cT0S&`=m@23@s(a21 z22#RN_i@{43=BZbxWC9Cc~;%iGCPJ*R{tyME$E+#+PE_WnYz^v-U=}-n|H+$LQRsANDB!<<&lw|J-L!Yd#l@^ zJnuXfcKY>2KOn9$0;ir4{o|rFH`8ZKz3xS>aiyk{e%`w7*DFre12 z#Dy1e;YGxi6wyK>SHL1X8Lv#(BDOgXYnhYH>LzGeqR%1^lN4g5$&cb7ybOYxo$JKl zg+phoGLTr=Ji&Kaz6o?4-z<-Sv^k(N)w-J z{38qa?Eu_#ILeI{&Qi8eWZr2N&J@-gs~k!Tg@I-4QmAYJ%5ZGV7Q+^81~V^T_$0zA zs*J2N(7uX;`^p!T6tX(n?DWTQe9dnF?CD%oVhQm?86N+}y|a{K1}K#AO@Kjp)JcGI z+7v_pM0P3;4{HtVI%Ox1kgOOcTTrQ3z_SPQ%4Jmc61b$neSfp{AI5 z?vQ;(0LYB331^N!qNj8G0*I&O{NCwIfYUrLug1VQxaV)`@(b0o12RL|J;LCbYb~c5 zu}&}^62TESeu+fc<5;q@*8rrwlzb^L#(}hGI?kko9oiAb3v6XF_)Q%Kk|(L+KqdQH zaPRx>R6$a}P*s$M16Ha=2rl9R^9JX5{Tjt>>q*&k&#LBlrY!+=*{lXEG)D=SnwHwL z$OC($yAz4PpAPmltcTWqOaOk5J$>ju6B150@w5r#{c*8Pcz4AD1G6t<6og{}{1@Of z@^O!+I{D22h=q^q8{mT1W|h?K-z^?Az)iLlTPeis#^$@>$~*P^wt!!G7@qQm!$7-nF3qS6pTM87KiI@JGT-bk z_#Xr~-D!})@V-bH#}?nP-qVTjutR`GBw)>v|03bn|3XX~ge1U-| z!S^=-z+4jfV|_-1TT`6iq%`z7cr>^hjXYT^+_YPI z$XX@+2lTI$#XWNekd1h$ai^36I+S9<%=vXRhj)wpAk$D?cCFWZ^0&)Um;_GL%**J? z*uofhHF&o~D?!zEy7u>3@BwcMhU#}vr?|V=69cWWRMG952~k+xV_)<=);@tVg_C+~ z*MOD*QH z{1R~!7$Ioa4ww8{!dwDWC43jZep@g@-#3=%+G_mc4&9i!j2p)1U>J8KN>Z9XSj-36 zB$w_nVjO^!q8w*^B>>5U^@Hyq2;y#eH(^4+AbgRF>^5ey!I_E3Gq2wvnYf+{pd zw=u$&4pI2B4en@8s;o4(3+*q#%t1u#$A{x7(Lr8#+r2~*u+l^oMeuEq)o>@k1qTXk zSZ5-fx4s0!iMl+#1`Jj9oko9L3K?-e9A6A%1jYU&zZ1nx^>tiot;e4Lhl?%CmH<7e z;-lP4&2!nRJRolE^%mg68B<*^z;txlkP7RKUo;g!NRP#qQG`Gsi$_Br+DwhZxobnr zTqaSc0E5Qx@C*Ed#&m}6fXgC}$na2o!U#UIjOT*0JDx?2fI8T`dfRS#{_bTwA5b_ZaPCzZQ zQl45?8h6e9MZ-nBbbY)maW2eHYuQafo~p+MXxq6T^##wSDWXNVTFh2Yl1-Aq_j1%N zz|-VIdxD2B97Rh79$E~jUV9Y(h7{*gIo57=n(Dr;E~wBPdk@l!y*b^skC{X>kadLr zE-Pg-z8tRwWNf4d8FB7G(yupW!fURDux80j2)jI>|G~ETrz*P^4jn zt$A_7eHwQ!Z5D{AbONE&1l3iHp8!3aHec=d;gXo{#pl8(?2BUv%wd|Aq-PhOz#)}) z^Uo8M-tLQml)YoW&BX$68gm@4=OE)s0QI0Cba#(5!Dy%C0iEawx5mrj@^ZFj5%Lrb zbn!qXZ_1#ezuC(*_HB~prJq^90ao!d>)zorD>r>-0edy0qGV7*_|wW9=;`Hl-&Um) z%>nSo1Z)L5DT4qSVf}V*gesFxgWkgw_`%9If*&*emurB7N=HN?o|)iGS9vBYLI@c- z-oPLS2sxxhyzH9BfUf(=SqhK`a+C?KfNl2^QPQa+_aj_=!%6aV5**R@3lI++BWVeh zEq-&0FcRWM7GVT`!WbVZP5XK*)XsVzK;BJJHurHFf<_dC5ochTfP-cgR3G8EB}j*w zaQWyechHO%(7RPe^RSSLqLDf(@LG`ed~&I2@WAy3aOR7(FKe+?2^s@o{lb(Md$_Ng z{1v!iZ=CBTV!{X$k4||w8$hc}V_dvk{rZ#aJMtLdqH#za3kc-VjFL$SaapqxZ}-)M zl1PDQWE5y(5shp>$&E@?8wvz$^<{Q5UBP+wryYc5E<@Sz0boefCI1@|E)*e7j<`fk zT-PQL8>(54ZD;%jE(uJP!v)+_DaZ=|vdg!RsDT@iGWY;gh5(G}&`{&}o&cf<`X%yO z4mbBq7;sZ__Ypvjb|rLtt$%~tmk2(f&!hF`KjeCz`hUu)TnQN}tO&=kHsx7_1?uVasg62YbFQL1Nsnh)nHpO}wgYve^S$t(jN5a#v>f95q8Ewx~1h zseOB`l`cqqK_qVCz4U(Q&J16X0oLa_2>G+TVf7%q1-?wZ5W~pc*V#(p=KxC<+&$Qe zuy1zaVL(~Wh*45kf*c+K}8 z4p}xDRP?`W+dFZahi^$Eur#%EUn~o$x5BwRJ2{@4{IzTx_u}5_5)NHw*h}U>U;2zQ z6#MulFBi;_K=)ov4Ab`fjU=C zDBEG39?My4GpC=@@R!EoBYW=$H%~n*xA=sLu5>a5cZQq>!EhZ}E)kmU&JXT^>OZf> zVlVw1#I*numw_TZHA3KN{di7b3PhK+VFH*(gnjB1FbEjyw}7DaMq5dpP1jPHTUSok za-=sHkm;7%!K8Yo_=@F!icGppA2o*6;DMmZ5=1x3s0$ca!uM)nAX0*DoWgJtV>mYx zz(x@-TjYm#BVWZ>JWJZZ_{z0C zX<=Qt&E5@h*!RtGYUXaHVR#8WS_NyY zDQ<3wrbCy2bk5eNUyUiAF6H_Glg9-bJRd?PAEHfl7-}4~^_n(%m&6;35>;)3zx_`b z2mG>u*6w>g*BNSM2gP|JFEAAAh-#w%ltQPNgCNB--tH>WtG!ekWrL49nJ=PSsCYe~ z=|e43sHsNal&Rdv7iA=-+~R+*lkK#l?~7#&*1u<@v)MFV48RS>oP`e3`k4A zX)GSKUA+7ZCoMcob1K?K;Ma=1yI6Vow9Ct|%=MZdNFKQSOE<5x5^{{g4Z~Rg(t^A! zJ8D>&`iixn$Uub=%-WY_nxJ6(26&$NTmvnTyk$5$L=-Ud_dB@dd`|B0ih+ zPuz8hQRuub;RKo>_qhJ-d=|m`jyQVt?3?9!SNM|+^t~}Yv{g*M9XjjPew$U2i*G*0 zZTM;3?(mxRO?oj`y=T)0a-j#wN&C^r?xfvLtCyK!XR6&-@^4S+XG=6xBgFdr-1Ht! zZ#J;MGNl)0W2Ujj=R1=Z#%qH(TRlzqtx?@6{uOO$7(ntmX1VyMUHe*AiVzO$^rJd!4J|VAXWcW-UyHCdb^l}{KZvaRP4 z2U0gma8}fCQHrL4tZ%mnvwu}~Hqq-= zuW$lHtBdQZ3lO)xcMRNe$;FI!MA`{>E(0Lq&g6bB!wS%P!I3c8+SexNd+h%X`GXKB zCqFji)lsRiR3HTa{D^87KWqJB>J?c-4Na?d7+m@OPHZI>{ua2m zq&Y$s1X~HM;FTNp;=MN~hKCO-OnjsznovM>P0=!kGc1YIYI)YHNmDe;B!IJEWuaUc}V~%`lA0zc$xbP2~Gz%X`L-&Ez0{YaVRy-nn#6f~7 zhwD`qP}F>|UEUS4_j@XlJgoa;-JsY+n=2-)!(Uwgl@sOSXjJTO{4msJx4{gA4@*;d zS{H_YB~EoNzp`Tt%iJ{ix@lKb-jE#m^qS0eN*AgptwIbQkDtSL|cqXCxUF2;;TVA@^c@STgNJG4ivk($~J-b!nF&sW|-gHYz*Ye+NXz~mQFeN>WzM$ zp62`^E&byCvsXdv9amR>EJI(6DX-$NPcLzMeZIwdf_IP@S?(vURZ*(9aN?k^X41e z2HkMVLzl>icQmzi*x6IMCZ`$(^^M-H$SaRw5BM!VWEB#9`H+RtZ3;kj`SpfKOsl^+ zTY#pG(z_Q|@MpiP|L}fArTfw{_))j1jVy;$xP8y02<}CW0m19!rYj4VqEStKTs-gf zi6u?={_UW6;`Ni@K}@JlNDSwikn6cjKjG&<(Vx^en|)z7+-U3x0^ z&BgRl+-`LIJW_fX!KoZYviUvA02*9wG>i?_@Y4`NbGlV6c`~{w0;6*+9LtH(xMwhG zX|bVcj#LaRHSB0Hq#BEVN9LxuEmco-^$Qf z>`D2zZV9)ThSmAqsjfo8B&y|%rJwx}6i)jsvr-U!&bIm)n;qwO{-cP|Vv=Sa;~E>; znXNJ?kg?YH*D8;N56Nfy4Be{3cTIsszsSH@@2J*UZwzk*Ggn_-py`4|oL`1JHtdZw z@0DJkMeuwhF9^0(y{c{ez@zi`2-4TrKph~k^f zhDZow=TJhkBjbAY+;=-~+gU$xxr?{g^mrK7vUgXS@FGgXLh94fZcFT6DM zD581upXU~Q+E=j)80M$_0bN{Av0Gb;_1tcXu>3vTbE#HS&o*l7R$^A&9{kNIxS zK68bXeNe%VVpLZT@p3<7`jRYeO2261J9jTI=Z8=R1~Pe(^zjNszu^Y>?q%Pm8iTTs6H`b(?hdDx+n1SoJxTcZYm8g{UtqVx+ z$6la8iDwLRZs1BWtDnC`O&5}*sX6uJY=?v+xJ7vD!u;ia0LG$tCZ_&&Vo*p6(%ut$n_Eql{wq?FS9=AS`S^sjDpWd^VRy|s7|dk`@3>gW&_ z4RoMyDKzZddTXy{68T8c@;5gvX-M=@x6L+sS6D-!pv|Rx=`KhmjPaDtzh=d-dA7q! z>DsNxZfz3mqr3kK$CMgn#a~K}e1hEc#y8(ZyS*ZTrzE75-;zZL4ZkOvOKV82Nemc0 zT}*{+@o?YFzXtd8V+W4H@3!~T@>1Qauy*BwqQdn;EYPohW&R}nHalcTs@1=ec9JAGsye?3$7(<2CDWKJ&6YESlkR4O}WlQAFID!*n19j=GK>lVmwRN>e z`0b1~lO+Dh*$ND*Vy0gJWz$$|cWVjJh43J~za{cTdT~jy{zdd@Sg+toHM_>~!;e5k zRAhx(uhXlEc8qx1{OVXCdR}2>#JA7a0p^^;!Fu=(0eXzM^$kJ#JDQ$wQ37Ff1Fi?@ zzdlu>HmIJ!l3%G=b1jw@_qOxh?BE4R8>#PL3)ytY>Vm$hM6BQ)R-g}$7LI;v{g?H? z_zEo^5De&k>%*PmW(k{>WTqj#Kq8k7jrzcl=xu4gQ`)54Ga$J9-n0OdDF3ar%iIG7 z*5VujY(e}3Y(elJB%fJLXP2iAtES)mqgo=uJOru+{smJ_qp5dF%lg#n$shU@7O0@* zq9*C6ru1ou6ei?1vMKdRm|uF3al zOcEAgdQMme^t%xR_*&X|lZM(OhtMy5qj{k33C^ocM=$qyYgoy2DpoM&X9NoK1bwfZ z()7rvcF~USL~v_4Be3!Cc7r)lFCEkLK}sI|B8JXpO6t45;ohHX81waG1%g7#CtqoL ze0}e0FTM5qF7(7*uW@VtZA9Dii(ae!2uq*uslMl4pUQIz1{QS-oD((!=pnbxlO0Z8 zB~jkjFY_fy)PvW{D?GX|UMq3KK&y}Nwbny)Yr_T@(1-{xC!vCY50sC8E0o?R;A1TW zuigX1LLwqfI=?_u5yEyk{@#|Vyb-oI)h+4^I;EJuQNQN|h&&^p!refuxb4i`x>I-7 zn{SUd+8)s_NiwHDMGmzrCThg-Cw;{$1+Lo#6^J|*jM>1KS&=^;$3^LN;I)*ObDa?2 zFo+^v_`7zp;KEXMq8CvK_r4&t8yu7`UR-QKrM_vWasGr+nBr>c>L2kUafS*(v z^_V~Q@#4oq5a9}v{68rOATRn5@GwDw3#SG751t4KZvw~+!fk# z;tvX&91{e+!z6gN!tEI%`Z zg-oe`1+<`7_<&6IvW)6V7)!y0-{Kj2jN*+xk`|gIP0Bnj0&~S=HN7bE7KX>vluDL8 zl}cGzo#KOKvIPN}g34JU){R*^Q^2q@lSMYAZCK&b-wM}dYn4CmyuZte%Fq=hASmTh z_uh;Iz<S8)CvP|gi>ErYTgCM%ZiYqP-fu}s9no?q?D85^MJ-!ye@-dz%Y9^} zXVCOpNuMv&Znqi}v4kWx*5U3x7UDJ-tg}O!dk?B=M_+lSXB>ZXQXlGWWuUC>#8@Yj zOj%;1Vo8jx774FzPL0blJh|^P;)$vqsxzeGo6^^6{h5yep#j;PDNx^b*9Y5p8C0%L z!uBw4efd{yzgxG&stIEAUm!Maaq7@h+iXj}v5ZL*zCM%2g%O-YK7Qz7AhDqMj1_U< z*GW$e6u0U%$Cyna99LjU4_C2GKgr=M;o;n_b)!f%eQh^3^Fu@?#kVYYhov$KuYPz~ zZMCcxh_YSkHHZsv7Oa<)*{c(&u=Mm5pe98JKSf^p#>I9A%!V&A;|i-$7_pg;R?T*hJm!b4$`5wHE{I$8sR93vzF;5dHE1_L4uRDpu&rX(-E+s^(7Z$se^m( z6|a8mkQG0Fxmi%YBM;zyP-{EoolVH1O8m|00{c}owQPehxb-c|579%{1P3_s>gUN< zV>Oq*Eu}5j1vzIn_&vAyojoc}Ds7!+a{l|p`9Uzfqx3~f)KW%Oes9LymBHgvRb_N{ zrW3?va!~tOaX+Pg!`p$Yej~|-;LMeZ+Abuqdn;Im;re(MQAEIT>{^G{H&v7{e!6p< zs#SWHkhh|u-D1AF)SSn6U*_FNPe1&AuY|M_cP(iwBBxYpepr8FZGm1)ug{}F`n$da z!q6bU9bHxMv&QQ{T5Ho)V#(cTQDT<&w+Zy@>Ky7%B0oJM-PLaDllXlx~n2N4cU@+=0esx=&IBi^+KDs=++CIp>(-d?7gI5gxh9*o% zzG?fU1qfV2#>BYL1T$9RxLr8H3TW+EsicVRY}>mGOB{CGEp)ep>Av`&Y)#py)fUU< z2#DMbaKEh5mliPMhSm2|vz4fyNYI;NI&UtYE^DrwE64-{#cE_AH{GG?05i0TY_i() z@6`PRx&WWyHEOlyRcdlU;gMYOrm%12BJg)M5v#!+;ApaRW5lz%AN)%uUcHr(tLl=i z`q>ML4l1t#VUgd~_Zi4@$e_^KM;C64YzXWlDxd~2pIzhwz@)28IH8NOfArO*d$^nE6cq(w5c}lP z3+s(F5VS;{gG|^!H#ZX0@8-S&bApA5PL$-{2wb4nZJmw8WJ1hNJO z+nP?B+s>R2b~-7-^E|QtgpYbuKzWZsGdLpFT7ar1g#N-g^qw< zr?FDX@@B+>_*m-(q0Jj2h%f^Ey7TpyVomKeV>VriJ-TLAuvPcv5F$mkim_)d@X3an zx&)WWu>Qy14{W8&*d3?@dQ^-=tX^U~Jrh?0TTdDmW~HZ9v|o`0wpwTGl9L1CNA)Gi zpc!x+-Z%ZLC9)-&&-%T2|4DfpS}kiJn*g>ak9sZ$5#xlTS*I*5+9pA|jS{5wXxyzX zg7@2#0edB9+!TZ(Y7M4dcJsHBel?a%fDQ`rAcHGl80!Vtjg>&hq(a&@uaLe;s^LRT zm)rGsLn7oOO6DqW)!WBoo17gS^na)Xn_*Ypzq$N>UyDleY%ck!l9NCNYNMd$tVkWp zo;S+$#ho4RF_9zx9Zn}SoraXWyACbJOWrM$3+g49K#olDIyvYT&@P@TIL#bl7qt}| z_X>EVbYN`;r>*wrtFvAQq;}j;~xPJC; zw2$85n<+2577&B&ps$7CO^o0ZDg4=okiYXXtpF|P#05%JhtYuJ)0PS~;j-*6B}TA3 zpa%IieK0OtKUOXH9`NW_CwTFc-+_D?v}(BF5%ixjtkP{-kfi_Ya-})8CgI6VkQ{GQ zX)>+)&LV(d8;Q>ZU2JwLmX>h!I;s2F0H6}Ap$LhYr0e?_;G(;677Nr^R0=tFzz*z2 zSY^b!l(l6b5ik%1-PnrXRN>@|=`s#6Q(aMNeWFa-;(F%YtJoA;jO9DX(A#nL<1-85vWA@PF)vB*+c!qhq819@>ZS zcR5sx(;ec(ql2k6bD?ae!e0@WS=qSlh&$9f+qnqw3Av75(QPl%hN>;gei1=OTP z)I{I!ZSfH#q__ZO7WD5}i^~m>up4O9xnC>z$7yRa%Pncrx7@l>h(=__t}?wTBsW{) z2}!`z@(J5aos}EE7gvN*C5smqw}I=4_!elpXg6l~j&lHP$F>}VwtDT=tQHIO4juML zPW466#cD9r9S2oi)=>-=AqxeWb}tQ{hs+p>qQ`4-@1-)!mRP$9rb0S^aPi51EA0wd zh|`#1gjwgOLBt!g?j=_lanPI;C)G)6cL#kEtwQ{bzBjiZH3&2pH~2q|m7+YezBOSO z@UoV~V4HzhcXB-4AZ#K7tiWYT#9g z%GbF&p8m{Fb893q?Hpe+WWd|nWxjeU-NH$7SeVNJ6)|XWXoO3mIcDe?s>!VR(fm^0gCuD%%zP z)md&-9c#ELNNm817Q*eIeT=)Tc^;x>$|I1tvNLq;tOQ!kvf7c(biiAR_(B&1#3ZF> z!E|Gz-~+WT#IqA(IT)VI+jNe5B;$;*t&>A~Lw;bh%z4A>npu zqjRQ=sqVKz(0HJSlXD{Pk>b~)OW#o4S(_B!#tk=OZ!^Fv43Vm2a1Z+B7!R5YI5iw!vNaBFUuvj7ZBm3`Y)Xof#jSa&Kb^SeWjCZ+ zA6dB}XMp14WbI90#hWIcUW-%KUlS;JYmgiH{C`fJA<`xVFr~?xxX{95Q2d1{=+D7G zYS0s}Oow|cH`7=Pu!b9k+VqQbR`97MSM(m>nYd#2-r=@P`SgIdu#8P%J@u^wJvz*> zAFa93JClgNNAZOR&8b{gk)X{7=*Yopk2UNQ{pX!6xN@iL=n>8K)iss07-$rk0TmMi zw_8E8eG2rT1iEd;gzjMleaP;ie%*nqpA@-R2MkC8FBzWr1Nv33=50D@R4;|d9qeba zwp$26J)X+}X1z;0holK9&W_ZO4 z%oB;<`(WX-V3_IQeD477o44Da>UPOyEf_O|(iO5W5;vm-?8hdot7*wux|c$dQw&{s z@R}*8L5eIAIJ-cdZ_BR9(1!**A)aZ`t??>uT=#HLuKQmueI1v0A90D&maY6~zUS}- zcHph${0b4r$Qjg?#^=l@ab-XKM2vRE!}7h|TkXD6xyr7U@GqM|MwiA>&>cQgAP+@s zQZjyYsS*4GDSIQJG;3{xT{O0`AQszFwqx{Db|{%VPQFlvIZoV#*>TeLlM_y_;*xos zVvh+E+zj9-cl*w3269!Pe7?rouX0pt`zNe~$Q2M700$wJ8}xY)n;F5!8e$ur=54+e zE12jlw}7h=l!q7(6+Gs}a##_w3&SIk>9aaiUqKN0&vge%jrHw=RiSAgwsY5&rB7$< z1P#(P$Z*zKDYz`#p^?|tMn6rCTb^s&nX>$b+<8|2DD z+E9v4r!vU9$GS zd9OkUoD}O9fUhXp?3~_`C*#t~i%&N!Ris(v2@9N+yx0Lf)=I@Uc%#LUWY;0%bcL73 zJFlFJeJ~@u9E{^`I}feo)e@(ZBa82$q}2TI$=geIru1tpArQ!-v~NgTVa$4e4L#xI zV{y4Czz7DV+|~i%$m6vJAoZYkZ@bshw}8KTzou*H^!m5x8fH+M+`aIy^MlY0oX&OE zef)o_L_h$NKeqeQO;X5!6Kz)yrn~Fd<^Pt?H49~;Mw$+*)!Q%wR`l-ef3*OJ#n1F= znfx&rqd%!`k6?~_1gFx)mwlsKT`~!|Bp3pVTV1?2Bo93-XTadZQB3S?4g1g^b<8=& z%zt9J_e3}THH|4pAloSc5jj!#_KJc>rr1F>By>7#{h@Mw$9|t?PoD<;`_pSu~nx?Ey!n(g?UB`v{Wd1sSD-o%(LdT*$6u7QVlf=$$lNmsj&5KKr@71M` zl`hHyua>8o_oOXvye2S@597?2{{Ubr@cRJ50!^SmDXDH%!fO}qltJEL(4{F!?9RU` zd(c+FG@c<{&Ei81)IHsG05_;4td3#~1u(E{{)-7m4pP@>BInEn1pOEJB1^OGRFNa$HrIPNI1n>9e*rSkxz?+wY;#_}wUJmwOwT+y92wZ>tXii4guYU)W`DjsnEsD5f%let(t&W(B zzTG+LJK;gLbIB2xAJ*nU&suKKOxvAIxNY96NU7ZK~MP5bVAv&lH2kZQll-3eERRDnpvzRIb${JP@nhBC zW2a%BzTFQOWsZu3FT0VKZ0vdq%Gd+9)7%~n&yH6ieNY8W+YKco6Gt&Zaa@0%C(Y?) zw8v~QkMYX+wO8g$!knPCqmM6Q_~GIh!Ud}@C<(gfGWFv_tcXiDo3bX0Pny@FxN8K$ zA2FUvvuY}>QmIW1+-4lZVuF8k$uf(K+y5E)!f;-kAo!sV!9zcGORvwvJOWd)kaXwYU>{FEA~gFrs?R|Ki}YahYWBdis;q62_S7CCOJ*2MT8- z+$(nZpsLY31KzsZpjjJK!x|7{gM;zFvjCKe?HAD-Q_$fx(S@!sJ8n@cwVh*Q`|YODOz6i~ z68uMAW{DqCJ3s2khqf6%r%G&4{Kj&3mIWHJl)*y}gy3DjoVDbnM~{ZV%nRcb*14hY zB$L;fDoTP{!xz|vID~|G>oM~jH5gyKNF$r9KjA}GSvbKTxto(T z1C#?iofla)8&{L`&eLu7KVH_d-nemY=IChc==gVA=Hj=GiQm@rrf~xn+TZFdi;kVX zcQUgvTc!h5Lx-nvHuELN{TGMpL1K`T6U({#$zpzJ&6D)A#f{!F=zLG+JT!W`*82o+ zO}h4IVT{&k+VAWMi{If=+3k(`>eq3#$HyCZi82j7XG4DsPEU?^DW`qUjyL{3ajLJX zd37>`W|6*_-1NJc)u}w7?3X@V9}=TwGa?k2UZa*t}qx&4j%E zuC_aE$ebPi$vLZ{`^8o$eZKW4hXr~b_vVj3Wa4)rsi)oOCK6K3f6Up9rW1e3>GZpT zUexR)|C3^YKIwE=sl7nj9Vdn9`kq}3{qK^u*{a92Y7yK|o`!v?d;ZXvXzbBY12>Ct zg;8#Hr5}yn>ks#sHAk#|q3_%vckf7v=c(*RJH)+NyceJC26H2g zFo#|_+R|x19n9yWATJ*@$J{r)`%BX*rIb{#;>)MNl(E#|V@0YDOJ{T21^&#~#oc_` zTyEN|ewLAhH-EjA3^*K;Q@JNE7gf6}G7^`3e4g@PxQj))0Rs0aYM!s4s^dhu_<8!h zLnSm)BoXEE>`s5_X0H49=PSFae*Bm1R(2r|#R)o=_yIO6C6ns}88DdkS+?$56iIv2 z@I=GMtSouqKev=TXvedA!>o%qqLxRxU#v%H9mZH0IPs;oUg}x)9GBJp@ZJ1NzaZLd z9%lDNU;H`^nGJsg7ryTOd^QTn7|%P;{bL=_wsKH?}Tj{ zqWVEsDQ?>qsCy$@p%>X`?on7W$`5`g+2}e=nZeK1z{3NTTjHI_fzqo%0HFuS2-Q!3uqP#U-~9SNTp@Gh3CrPQyu)7`Q5dIwpOA+!$N2W zi6;A5CJQk8>YnM|6zBqT40>P@R0wi>E>eYk%9x4UF> z)pblRJBQ~@;`E|CzWZll#rAA^6|LC2Su{VY|6qJ4U0%s*DsX)9oVYK#EWh}rM)u9r z{fFgc$>>$>OKDZWNcov-h0s2vVLewypf6QasgwJH&+*?kZ5FAcd0YQ@$~7@xmO zjW0!3h-4rv?rCQ~BIOnv7Dx*#chO?H%uP$R{#@9aKIpPED#X23ZD*?DLy6H>t%Shf zZ^a*JN31D77+3A^t)=l5$EVw`t84gtVWT6|r6SZY>)Rlid5TaeUOAj7ohxtt4yEwv z*^;;j@|!llApS&Bz+BzOTdunNmESgq?7r-?(qx548shGsXQ}I+m(+`AabKs&4_vMo z&bVHIX27tG!|X>@`COvtOv@Hgm9^SE2jd8XfaJpkPtJ-o4=LifxO5w>0|n!&#f@?a zTu-zL=S+Ij4_{DUthMHikE$~SqM@ho=65;XeBrH$O1>TPf+apP;WmNoUO~3_-mGsX zmj1@g+)^Ih3wu^=_0mLHg;7f=<5Nn>(WrKo>k-gfmx$@O6ZrO*L|lwtO+KE27jHdq;@Ypi3wqUp0+PQ2%DR~z)I_W4Yew1Ab4}B?WOaL zQ`7Ha{G1JT<{m2-!B@|k6vC>;%XkrObNZYd6=r1w_^90fHs zQ_pp-h)FQI=vceYr!93+JyUygspxND3427beB#Hn`@-MLq=?gKQ{IbvL089o`2-n> zK7S$3PD}3*Zw-GqN;{yPT=4!?x!Eh49Bl=cqN@=#b0H7SF~&G6xA9>aXe#nKUbZa4P94eWD?}A9q4>Y?Y&D9n!sFP$2s-l z!*k#8s`+bamvfjN(OoON-u7!qsfy}BQH^B%$HH)tV)3r;nCd{nKg1|#Yvy#oiHLtA zJ&{oTyY~)Wk1?zJDUZab&WE#)&5FbbBzuHhd>cth6r(D@QS07BM7C5uq@M|&ElSJx@ z>YCZOmnuAubWvPLR`oH!ySAk7LZ;2%nO8a~6!}u-as2G#MFr)wrmVcoXs=s*{Q~VX zj){sM_+)8W6&&~0!)w%eh_!0DhP6DMG3?JTH<8-^e*i;3yuUq3$EeWYgb7oynSbKW zP_*;wvEkbsbk%G`iQ&{mrjU-cWV|IgMqW%s@1r8OQPYfu6a8Xr2OOBR09~3DI1s|( zI3#$YtDKmJm0Q5ADQArd4qYkiGLZD4!goR>>e`warUBVfacSYH>qaD5`;vL_L@3Zg zWgV7EX42{zCGOzVC7bi_>BYTNZ-3WO@Bo1OkC46BY^za%fH;}d!KCis;1MLQ-mE0k zr7xQ>qHo7Okxr(u5t9OgI}BET{M^v~K%+`inM#A!cqZ+_Ltfgt`8S;CQBU?SzgkPs zgIKMxzJ6Zs>6G_%G|H-M<5d(2RpK8J7$J-(v18~)z7HC}QH2#^`OP0mUw_JO-`>qa z;Qdz$ef!7THw=$>AuqDJ-RDBfF>5w+uSM4IO_VE1oXUy{55o+KO-KTZ%rqJjLh6+L z&oTkba5i$20+>Z;bKwzu_GCS7j!6z*m^uMRX*SRK@}z8?DiA6Y8+Va8Ql|OXu~*_E z6F`HBJ}7AQ>ht^0_*T1rdw=`({>@v30v(AdaT9_IDUcHBZkoO(dL*)$;LM~ZI!)MC zbF4z_=u}5BE1aXLnP-G{S|kq1WMx$#auK;raFfsyt_4TPI{qcYLQ=X|F)W-s)3X z+UTyZ+T+U>Y|pQPaDS#d;o!*Kvqkl+wy^gdYr_iHWbmyZj-Br=i#E6i#X-V~_Oyc%!?+QDdy6%okuihjrQ27S~(tbfp>hI&}JTexNv>NVC` zZxWCXtSIms>v0;N(}>gf9A1cWu=PQ_ZIqR{Kf&JiM%;C5(X;%VaDtGq*5HLr6HuM$3Hsdk!T$l3?Q# z#R1i2O?HUR8EP3`ii8tRv0!7pXH{p`%H+d(6|^eaZGV6X?H^EaF4wtPwTMm~l+Aps zu9>qL)h-(KeY{0vxd5(kxwA&{R+$j$ZqwE3n>7hf9w9wMntbgf?)MSr^EFfZ#f6Wq zx~mo8VRNPEdb`Sa^BK`}=K8Y~6X|mwBRQ%c?Z{S3S-5Xpnmhw(1`nx7^gN*|@wD`; zvU0SYDt`lYp|U+)R-ZPVE7{`hqje8YxUI}n&4^A=Gx6TkBU|ioNigD27M`^j`;4O9 zv)u@DH<kv|xUwX1XLR@h(?$mCo!$SS?OxyA|IDcShYRURCr&qz}mD7G-=Qz@7QmtYl zRG5>NcdW|A`U+3`!(nVe)chHoI>ZjQIlSIt=j6;biW~NnaJLb80&fL8)8TKKag94W z8`qKuyKpwSgq5brCYQvtF;|cFiGywhINy`?(fj^5$Gqg4WZ5CgVJF3%Hq@7?-4$Ph;lX^S ze1)+~aHSKMjw4hDt(|Gk0eO84OoRp?k&D?@3HUNE7GqUK$zsM6zr9K11I%#MN0_mbdU-Vt_+Uw2mvu z9d%$;T(g7sa$v8fubV~?DSr@y7ig!7jS@_vShY%75r=g-eEizQH4X?bk7r~kVPcxz&?|*+5 zg7Flw$7v(Ne#{tVgG4LBtyTK08StuQb;MwBK*Tl_j-hX-j_J1$L^l;g7>Doq>7pI-O;fdG-or)Lz#(d*Kz4q>7 zv^%}$7;k_g_J!$=L(~xCc=|#_o+jo(9{WyfY#niG#MR7%QV+W4>x{75>N10dW_EfB zbjEwabcH0S3RU$64S!zx0#+So>j+V^i9vixemyKF{Y7HlB3|_jo0v8ZDl*jTuAhw4`AV!vAU*#wyaaO?uS|4+G!t z3CTMG&Qp9#IQV<{o^J_G7;0*J__o*`zU4TKM}(TZ2}yj%H^!#i2`)l4PAw%^>Jm4B zWV@Z=5Nx*Fk(O)3)j2PHZdVi_CX1_>G@XpC2=b>|u^tTj!_QMMsm?hrDdFCXspOc6 zd#cyxrR;fHlQ0W#@(2s#G_I}idVEG0{iD}(_s)|r-3zyfdJi~ zj*)?)u6XqptpCZ7s%;MoMsSoUT)!(MEdpF_Brm4>4s zcK96;$#ZrvIZ9wG72%G@tAl^x(2oe&pgb6%(!w+?jLb8k;6#A-G!TEEpLawk+CTDO zrsQ69D2tKSYH&rr;|&HYNk&cYH|9acO5J=76Hb=pqDyI!Ap)?Cw=f@H)v|D_+QPeE zm}Q{4usse6MP0-!XkDxBIdFB;;~s?j*mgS}&0w~C8Y9#gK1e`P`=oz@MV$3Rh%>@1 zO4|LrH4qjOy%z3nA@vG4Nx0LC0Zj;S^PviAe&F11)FCJuRziz5tbF)E3eZ=#X|)ql zo71H(=~+)GLXWg1Vyenq7Z!r16#4!Mb3qN0`@YPFD`9+otmzPIJ*g5}+Bi-HF73h+ zk2QtJfL2eyW5ZOoJnDad7v)3nO3sgyhc5}#PptY;z>P8gInu!s?F7Z7_;-0NB0kx% ze!1uLPju>08T&^Ie8(fq7m2RjBe{=u$c#OSY9t68rK1pYF4bI;6E5M{FEb{@Juz#} z^_aM;a|0&m-5XkIWOrJ0=FW?B-oo9{VHL_A$>9bjMI6CsnF)Vo9_OuU!{xig-J-%F zv=D;d0B2bQwcq&)0~xOW$mIRoGy9ayRW> zO)h8bM)mmkF|5d_46Fxr_@C5yOC^`20s*lgF}IEaWI_C_?1(@_ z6TH9XHJK~IqK7xZBoI7CM;fWqJ)*e7|9m}i@IwqkkJ2M_Hf23ZI4cP!*D3RH$9&Vu zH*0aJ2E>%un90H6i2Zn|$n=VaNW8PcDwVK7RTDBNFy@-G$<&ET?`yH3IKMA?0XR9U z0xY~#4XRngIRm4T>;f#4RVmMv~5ZfvSyi6seb!is!yOP9aZA1@z;x4{SjmIMMX zMweL)0b>CZx4jJkU;zQYmmUuRHUWf}RSyAk0n3-k4*`GyOP5Lz0e%6?m&p(TeGo~K zh>Z{r6lsuh0!R{&Ov??xV#=@CQF`J<_G?{Ue2rI}*^Z;1)#Z*%x|Tovn5947t(P|eaD z>rR^$5#Y}4^zc(|p;Xd)i*F}uO!*(>nxxBr4eb1Q*}L2zm@QNDxBMz~`BA7ht>oRF?r8?Ob{;ANtQp-3Zt5ck_NBeF@B=N@9xc@~j>BEeKaoBaG28b0Di@$zNl5NAjDpk!to7eZB7 zNfTkic^6^Z5m(}ltir*mdkiyB+4;>f&KhBcdfLRWy5OFZH~vcm)XBR|D`W)os^T!R z{iwwCmnhqdn>90~U=`h5(<-dJeT(4mx{7E8ZfxQ7s7aVyt04bS>yvktpbEHuRha`O zi*hEVMnzGDIN1e+kf|y}=jbRWN_mTbv2@!`(2{bN0-mYq#J`phR6s~%lystqYHX4n z6lyx$<=GAoBQb_*Oc^po{1a>E_WbhKmTu4%acJ-KqYbNKl z(mnok8}=Z(eYk(~MF`CwKL1jGfcvjy>DB#%YGn2L?%^|Px&-4*;B;gz*YFD>N_DN9_yN+XWBIX!EY>~j04TtYE zknBwvtQ_phq~b4IBr$cXotZn)iW~M|_D!4e>k=tUaIS#omsA+A$c(Um6H6w%h71<* z8e;#}YD7?t!(Ws7@K;0(3Ht)=Yh35Z0vjUCCz)-2vJJQFc$B=zud-hCmkLP7nue}^ zy~hw8-35&T;U*BEU(p!eInl)x2CSiC8cw4MyK%zE(H#CtQwmVB=nlV-HQSXCc0?GhZQpgg0hiLm3e}i2JP5o#T=*vvMqrzz%7rK_XJgTJSE1BMr7Zp?DY1$fP-Z zCkzD+ZHfiVfp98+i1jGJm2?N!YvSl7e4@;`M&wv?s7<@eAuzNoo$wIh3SyaI={zpG zSnv#B_v{#@d%W7g&cVW!8{LXY5V_zWig9Wq_Qa`U{lQ&cIHNB57Iy-Y zMfAWP;cDc)pG<10&@18D>E*IlkrNf3tATS$^3%&O*>ZI-4iQja6mK=kO-RbL`MA>4~eBC@C6z01VvuGGV+ z4A62m!!mk8cf3*DGo(fnv2!-ZW4AcD=+Ag)bjl~RpL9s9GCY^^%(|-JCq#S$UVca} z7)~0Xt1IGv6b6NeA_^Ndsy3uY7MiipT$~)(qSqk}nX&uz;X80a;kkD#V?p}GCxsG+ zDsDfC(ukF0CLxZ;WYeO)Aew)&%c*d{?aE{Ysg)+pD*|evSSB`yE>5t#Xy&VO2W~D{^XHG z!h*SP4J1pWnG2 zJt*b3T0YtrTQwqTLhXAU&LGH8NMn*cYR#lX-eU_&5H>so@uE>9Uu?~($PH*2@7WG$ zG4m03j}93<9CJHD+9qNx4lec~VzHU?P1t#V@P#4g%~>ja#{pINtvWHr88(ftIXIIo zFp;$bhQ0Z5?xUBqp6s8e4U-#>P+`gyLN6uUaktB0o9p)NV~^cS6alrxaatErqWlm*#; zU>s-BEY>bY6`#yjL9Xf%Aymvc2hN3Ln&L`2B^ks_Ch?_Ny%$QX+ar$}#IAVSKL?6- z+l(-;3L1Unej^N6t1d4Q{+2ehcfN@dwuM-7drF&hQSa~z1Y1^Cov)2uDd>v+)+|1C zeTgxMVGa-s1|hW1rxu^n@Q>>1_=oI&f`ZuyfLd(Cv853h(6(4(^GiASh|QZ)*t(8R zIMH>mL0n=$vtNeWw-=_>!Yd&PtS=_m5F(Z1fma1(Hm{f$&sf}fi8sC=L5rb;;3k=A z(W-$*MIx;r6B@|;!Wb}wesAKZIQmOi3F7^qv5_ykj<1`Z9i$yb31(QZ5@A?>K&ib+ zb97vSjCZ1&M&1Tj9yt)J1>uA6Ot7L4Obe=19Di@7K4I5v${WYvv>B%BHvwNMSDYvb zV{6REXY!nmq;o8vaXzFGF)v&d)R)-PbQ8!^Fe9kN2|g zuse4v7}*i7DvwAjHc;SVlcr~Wree?DW`}5>)zP>&D-&bE!&%b%~)je&<*S8Oc|8sl) zCPaKjkmcQP|NHIz134@$|HmD70-iCy{d@iE--*v=+xFKVgsI1a=_WS2Is6F6BHFqc zJWPK5L4^3}ag(v!Al>V~E!5XNnr6~MSrZV85pBmJ>1@E~s1o~seIbFOaH~OOJT(lf zJO3Dl{`&X+@Z*y9+P*pbNUNNeFuhO{zy831@eC%%AYy}>Z|&jV@R~OK9!3{}+6>v$ zlbdeOPh-zewA70+v)&-2qu7W8LRBCBENJ;x%0m7igxXXm{!O@3-t z9qMRX9e(`vhmvyxZ1$LX@sJ&nX5qg){Ps(p@r+%;L%%z`yUCiv_u;32LtK{yt?~p{ z6bTd#qzDF9#+)95pa!n_#Pe_sx5!}_wZ{sySCyhCQJ;ncMz*_V7`o-n6tSgSf1_(^&>HCeB@o06AyFXk`nh!DOYYp zqL@DRS$n8|F0O6>Bo^q3(hbdY=OU&*ZOg75H(1968K(L%6Z8 zk7662HOoA+ZkMn~@H3sMpAa-KC7n7|Esw~rKiCU@i6w6(Ufy9%t2n~%v}xJ<)d@-_ zv+S#qPris0rG==73}y0`JQ~4MaZErV<11jm5$OR5YiLn@r3i8kAx^cX2WBc9_>59P z&&wA?Q(nH~o2y51ADe_?1HEb3OupN@6Q8+bdH9JA@$%OnsE@Ggii597uMR)b-U;@B zI%{r!s+>c9VXq5yjT-H{+xhL|B&|yT+&}zm7h2o2E zXcXT(e17}-o@2z;x1ayz_H|giY?o!4tbY4{8@#TsYGyMYui{y{ia;d8NN0qvg#g`k zVu5G%M-3gvBpEw#x=$Xy?}o$o90G5V9NrDW;{zG6VescSCNrE*(*>TK-2C>puy3d! zBE}k&WoAJ88^pd4F>efW_z6-j*$7-Ek5ZjN5L=orQ~`B}o&w5BF(ydFjCIh+tTris zaZG?%cLPu;t2h_SB$Hp=9DYKb1bN%5{_qpF7kvj4LF~a&!Q;3eYzp78>h028um_d< zR5(ZWX8i`q)0z?)<@w`}u<}hs4J{^Yw6-3Ez#?N>GFW8Fd01}5=%h#`8J`O`_p#wU zLh2VI-*afY!_T(!2yPEXB9BEP4@LBUBa!6rJ#7g~<-WkRAFd49(b|` zUh7&_o1)4xOLEUeAPI{tYmYx7&qZWd*`<0QvnduSX`&8@RN(O1rdjbg-(P!=!IpYg z;=DklB?OScR{D7Xv7^E!T<41 zt3=+M_y+x}6RZtwMUNK`PmTyynA`_N!uY8QKR-DlB5iFB@0vXuaC|k9ufQYtCCUU> zZ&8jYV)q`iNe9}o9uqmBJQA5b4nIYfL_A8FS`@kECk!8vM?_@q*89WH9BR!i5vZ0$ z4u^4EJ!iL4hm5>a5wvX&QBXHfD}kU1gD!sql!b@+)YE&}B7xItG?KhFd0J zu+84256Gx=WO>QQmn6Xwae#JK*?N}Ly>SbSWXH_!t`=;_D6a&}nuh$yhO^F%A6dx5-Yja85v#eZ zq}kd*Rsa7#Wnb4L$8lx(SNsbSyZQ%NRoUIu_38TPX4MN}z{0E{k3Ep=8SFj{VQB++buI${HqTXV6I?)M&+2ae?Toukudn!lZ#cW&ZLx-mAx~uKlwmr<*58iD6-3sNWn9W&t#U~Y<^B+_f&R&@nvvl&@&j97d{hWF4Yr3?GN+0(d?GHf*07+KL&o7lr&3`fj%~F5* zRH|5~tcK1r8)-Cz;RxLB5v+80zQ)IZ%7w4Mo!ub;XXw~}S-#P1482dTWI{)DyHlTT z;5CO%63Kc6s|Z4}+(HTS+TWQSUM;Q|o2@lNnVk;@(la=KW?$Fr9`%R2Cz&|JHLw^i zb(27xL!v8{aHOk5kc1u~Hp7(~Gk8}deWGlz#zfkHd5H(wPu$$bdW$?ZnLpyr2)Emh z;QJ_n&?Xswr3T5-OIW^To{-&o&`BXL!#mup7`qE4&dqU>8N`8xDp}#lpNhdEr-@zd zp7a^7s@)F_?dV5{4U~9SRv}XVv>5H4f=sJ?u-HABC^KmgVkm2Xz-?uB5Qlh{s4541 zjqy{sDFKEBijR`rWQeWw%RSEhSsF=d(Nl1!z4u^Zacsuw5o3CKm~8!AbDg6#Lf zTRo^xCf0AjAWvsNzEvNt;j)cs`KGmtg1H*eyj?t%%K1#iilL_5;s~0{3c}8q{G*M( z1WQ-F0%KnLT)Pukfi&!@)I(+o%RFaQ>gx(?_IpQ?xC=tIS0rbrh9+E?S8QHlFkugU0 zWjq<=!n>=xxP>=wz<4=tcvF36uTEe!V6KoAO$+XYm?xO4BY{E)W;Gn2fSrsIv6~I8 zZOVP0ma!$7+Imya7eyF%^8_rrHIYt$!j6c4co~+nDL^Pe?k+j8h}67=4M_EW&D+<~56ThMmUdmYZJLRDOG`E0xG36riy{q;Nf$c9ia70YXt^yyLXR>_PG%b@6g@bD zCp;j7DDVVsS#1R10oihU``RggNq9&Glp#(LEOTMYlFfRe;~0Kj3xlEUNYfKl##w*E z+#?(0Vwjg$>aRhAam~DDaa@*mo3_r;h9AXnGx|mn&*MaV8#-xG1E-Lf8$%Q%C742Th)%PHY? zvs9(s=ZO^52Hh2FWUn<6g*2Nj?CnDETz`QO9&sY-pYX&CCWI3pz_3-UYaS#!=oi0{ zo`3VRUm6F>VJiN$o}Ni>F^f>x{k1;4m{b9FAiRW`BY@3n_s{S+%+@*q6^N2iP}b7O z%80?|K7j_X%pf&@g+gS1l+SusVo;QVTtDV93m>?oISZFY zUgE`6rVyoqpH$cQSVsR7<8Y5?Do9#r05kQg#9DHXAhimdA)$PK$e>(5X`scpyh4x2 zi9AH$LBYGNWIYZM2@GK`gpyR)Z38LB7Z;k-e9Ov&> za&}U|&wHwS0AWV9%qEE-_6kINdt~A$WHNR6WqX`;xd!@9{TTPjDUsVmhLvs0T$hA< z=gt7l`o>xduiZI+d}cw7RG5Y*XAK+(us@sN^3m)K>Ukha&b8ffC(5L<;GDn%GFOZ6+1W01|pWYwA3@^9hOC{w}EGM2?(PVQ?O&V z+l4T$n$gY$5U&Apt=N=%q~R`7%=R@l&qVM~T{%`85a*!ThXc6ZY1p?}8bz4%)Py4+ zZq?V|S9phiY+|CG!k2yZ+(q0^hHx3+jawVvHOTZ@^T0l$9SxEBs2C3gW5+6%%M1%P zp007VBE*dH1)<2>Bu@{>*8$76A*pHu>Fn5FBW$H?D7@DIATw{=f++V+IBB<7A>-|= zSW=7>5&-ECz9i1uvWAc~%6zz>f*FP+he&hfzEPZi=~E|sfW<|>oDX3Jk^_~7Z63i# zFc&Z=VMMFpg5*rdQ_}z^*GY^q8?~~rH}lvh!kU}ma_yO$wv8;T`F6`!_`}Jp7%pTV z^I2yeTDL}O=&t5@@E}c2Gea6g%q@D-2r{#ZO_hb|d5$%0*I(e7HgpJc{E>Yt?ivsy zDebO*%wcegUegCibZgm>JvdEOKV1*?Z4Cf^!ffJR;MSip8-@Evge&+_X`$;kwgui& z;`M(zx`H+C8;7(cF(C-}T;^RO&J^FT0I6s8m|m@CmPSwvYY%|u*Gp%F%pn@N7I5MQ ztrOzGCiJuH+hI+ih9l6a>|(YejFClsLn_UG7Q*f_LtG4nk@7?KBRKW#S>^_NMnO`> z5~b}f)WB>?GRQ}6-ev@aoXp|wGiYD3E(S-4{x@6Y}v0cH$B&9Ajb?a zu8w|OFh*u`dx4u1Z%FZg16eGJIXH?6oOt(F7O-nxl`K+X=S9eF(3U2vAGYBGn4W5&sM2L)nTBvnnu6*zDy z?@WgK@*GhDbWn6fF)NHq4iQTkt{lOybvyJSMiwGxm(bf*%=1!I{XVrx=Yj|+l)`4{ z-ir1kEN8^370Y&02F8@#=uZ1tiA}J77#h?QQVeDYv1-uM%xo~E#A9bR>5CLN=?kfd z1;)c61ng+fAwXe9R@F9OIg=dxigZ&RSEG)PF0+b0aVw;jJWnW*h!8tU$#q0MSJf&v z+Mljx+h9pTJg|h!>nz)%T)HFOPsKbf($fr9w)`sUhHjRZk7%&O-4(FAg)UHk;R2b3 zsaZgXk}g9rhs~Wdr}?oA6w)una@~W4&}{Cd(+H!`Fo#q=_naekONOQ=fBfJ4hUT>9ELy9=c;o(p|{Pc0a%VVs#F ziyN-#?yoER<>aIEuq=)3cmdVVng1FjraNwP6t9X5Xgp1j_IR7}oNYPL4c>_}38fJ| z!OZ(Gj#$Elq^lEHcC}SAkHdYtrz(BOE-LJsaz8-H3MsW zEiH<(K-^bm%FzZ=S`zqYCt7{j|_O2%X6^lkM z0{R=Ru8-iveYlfY7pLUBW%3fFz3n<#A0d3WI9*?Vem_%gdVwKraq=A@!xmi%A@_IFOz8^@Zc_GH^o>1hMSa+GTgO~rlC6gSF=o(8CkxC*v5zo8|_ zM|oa4<84K_8RiCTF18PXdman5m8o6fDCp)sXT31n!eOp)ErxZj9AY;MLp&8%a*b@n!H=G= zOC)#_o-*j2S1DDFgZb_Ty;QDJN^e|k)h0dYMFv2B^?n-kAeE@Wr!F=Qi7+~jafu|&xVST*^;)jx7`O4dLLlQcL{Wh< zdx2iZPk?&ab14V&b+s5VVY|!&-~-G$+pUI|(kIJ2u5dXzD0S|fiJ5nPg7ui%3tAW3 zfnH*N54Y>H3}!=pFV6^!*%*w|jH4b}WZd)=uMuex*@^lWYuqM5!ybuog;i!^Ou5?- z_IW(`X-|uF=!Ryzg~Gp&37zFEAnxKc7kSann2{RojL#5U8@_pcWI=6zyFQ>cs9W)Xv0T z?8Dm^QOvIJLrzrRI`OekeaKL%HdaJS@QD`$v*AC4M0wHXB4iCX`>0_ux?6om$>*UW&cE?fxB!&5vo5W{h>#<~}O z=~`#^Vgk6ZiP6Hi;~`mAH9e;ri^=PE0xR^@8`4dX_aLr`Mj+@PfP$@KGfneXHv{J^ zrlM5@&<4YOWVXoig9*=B&bW^*?UGv&D};}Bs;mE948;O(2;BMFLQ4jYOQQWPVz zc@INJdc*b-GN3_u25KQ#r%=BdA?=Zd`biLrr@EEH6Fk!Zt@H&BR?zLdf#tM+;i8tq zO8^sEgeoYZMB*Z(a5rf;kOHVuC3CoBT^VUAmZO1iAV@)}#mW6hj}p?AoMW|x$`6-H zr-sY(isS}q9Q6a|P@81Q@ZKNyWp+S7*Y)snYm%|TisnAiGuf(GrnA+O*_4!~J?L_* z$8@~3OM|M0aI^GkHd`bzrWyl(p5L{t4>tKmp{9Sxmw zIfC6?h(Q#Bi?-)b?p2?NN*n9{ep=E~Oo6XM66O+1F&R8m!Em9YMtM^%QYtyt3 zY+%H3aoZ{gZ86ZL3qOz#u(|u)AXuJ z=?k6T%>FFCf;H# z(HqEN7`V@caDO#hiy9Pvu5FZ1O2rC@^hGrsn2tR$wi*ZB3f=K7@jeh@p3u@%yjtV^ zpx%+=&VQ((2AgS0U(G5^X_V-trMRaO_h7pUq~D}XK}Axd0^SQco32-GQYr4xO3^NTo$r%Q4qXj-!_yuOxf1g3T?e1!>9@{jT1zbrv+zMPYw9)B zR0>Ou9MCYLBbFzBGI=u+ww}+_)U9=bFtVsQ70s;_hM0FjBT$$Q?@4%a+CzmQ2M;T_ zlzWU0OnxfTjtiDg5+`@h;j~QEieNm;1#~^gS)-J$F*E04>Ng-ecEGk z9}}rQlSw>zhIxD)Lh~sq69|4{d3)!is-XPgsJDj#`(-76#PCX+aHjEMM#rxJ zyViJfz$oH>Mh>l=vq&z4A2m_&++>j1OUMgI3nB*i=^bD$r6i3~d5#&gN(xYWZ5Kh# zpmGTvpvj{;BO?%r0%@+Kkx(g+}kjYh!SK9$LT_8s;ndDZ;ue$BD*LAzZ7#X&A#Z6Z6-zjPnNn zAvXkn_zV?iLnxSL(^Cq~ikcxwI_OdDbZQJADI|GckNGJqBT(`#O)o}Iw=wV9|eO90eZzoSphndTBR^9N_R!x9p3t z*c!fPq=5vpjGqj+-2$99`A^wzWrYa57{H-_dK0kGSdJ{VJ(^ROqc*JJTPK`?TuUI9!HZeV1}mg`tHC;NnQ zl<$JUsbtb<$nwx(#H`J3xzZXP=p6P%SY;q&YM;1!hlyO>=~J=#4Z^FZ6c#gxQgzCI zSz7NGrcChz#kHE6t5|5mfFVR7nM@l?lidd}lP#ABt6^>gW@|84Z3BlKtxew>xC8Vc zuPk}>s+V!?3f8k_y8A#jBzm+c!04QVksI@IVC~+I5IdgT2XGeCtOd~9hGUZ~1@;C2 zE{w4%L40o0E7;?gqm678_`Y1^LHNjj2zH<$asiH=u9fKVp$ z`Ni&;sNcg0%#unDP^?ZX!-+rN7@(h80+^X4fLp)$?t}5}*&G+qc+3mW>E+0OUwj|x zVQ-y*o-OT#KkjdbxM}B6F7)l{3AByH(}wzh?i5{g23B5; zpgT>Ca2Yk09jyV&x1Q%F>v2;uikApjX55?$T`e-3A;9$+6X|jHfnD|q;+8U)Lz;}N zGU9Fwp{qA=hbqYCX3K()Elu$XZ_>uqNH|ZFyQK<19@8-=^PLB}ryfjy-6r7%5EdQV zq65)sJR}PwXYJ->I|W@f+5q5Dugt3j>uXg6Wqv3djSyDD zm^Uy)Gb04R85l<|nEi#IGOUdA_E02;XbTBWh8%0^@V8##2~d0D7kFarFv#*k=N`pQ ze(xUF(HCI z3{AKk1TWR3nYC=^PBAWTmBhoCVMl8!({)m}$oXPDwJJ<`1qjS?$Vh}sb2#7i`@rG+eVkedLbwXq_4G6 z;p!A}Gk8+V*x>F$J6pSJe#nYve5;8(N;0~1aqnoU*N8HIb|<*@kKtE|`$9R8iOIXg zOnv2-F}79_7&dwj_2whm-5vaKfd${`wq1&G<`8}g0RmzC#w|E5!OzPpud3PA27OnO|LAP-jVCx_{0@7{Sf73o&xIm+rtv7{Rk=HNCCPpJnKt zxIdz(;9SEFK)gn4p8{+wwgic=O^;C5HZG!74y$jWd3J@4QfOUnC<4lfPbpH|FzS43 zFiOh!({=LYQmq5LhBn&VBFCXdmlbV~o>*eLo>j-ZRPGGELN_~+TeAH>l)w^uJOI*V&IgM)d}qqI>Z}mgh-)qoV^*KfdT#mGMu_x zN7LMP^8vb&OZcKrN4UEb(TJBM%G4O&JG6{82>wOt`wa~n79?33_-YxAVTl`pcCXkj z{w^MW`@q|>5Vn#S?#-Zz>Wv7_Ds3K4Zc+7&hFFu*Z1+rk|2D9r=*!`>ob8X{-kF!h zM7-`y6PdzaNHDdSSvKB{VDrGduFp64h;^Bw?PX75OGFZ`o>ktA{F5iBNs}oc-*gI4 z5n0&nLAdMLO?Z%aWP!uv?}JdB9r=dWu)5WMz4oVsJGU#;0VMcUPqRAt6dw3wi0FY! zwR=4>AxjBup=JevJDO~%)nYAW^I!k+7w`R-cBhwb|F{48&QJc~*S~!4onN$J@Db;G zcH~)mz^-*X=J53puRn@0YdEF{!U7NHIfh(r7)M>Q#==phw>}Av8zD{f>aDBp{VoL z`3#>|5so1$m@;9t5gCrX3~$~ScSw$IG3#M%e|z&RD8XVjl7l$7-aWY-!LPVrZ+hc@b^wD) zsNj2Sy?e40lMq8l%ok_}CV%s+4@Xfv*R8I_(a+VJFG{UQ^3p3wQ`BDt4;7&wujS!d zOe^LWQ*ldz*DQ#pW#>nn5bCCf!(Sk$;kB_ZL(RkiEqb?)+TTM=iw1n$|; zdp_Ki&a!K^ZdRo(gYu z!4aGN<{6^vb$kOeAnWUx0+tykA3r;K!F$Dfz@2Es!_Cg-h``Y~%^}}^Q9~(1G=+{q z;)LJ+t!t)a(;bLl+Jlbnd5H2S@c?xPu>o4jh0w?lGt_x96&Kf=(OPI|+`p5Jm|(pL zW&qcl`RyZc^&vh7siQAp6%Q5Kr101h_gJEZ)==ir%7YU_$aKu6kgXOnq9sOL_8od^ z2>c=S#uVNwb8yLxd8~_n(14zO;%Nn9DB^3v8}aOdsc*L%eF{^ZRioABT7@AB8_@>Y zvL6-3X)_IxFFx8RIr*HXu&Tp#nD~Yq{+#Een5mNvy_fRPm^uZ%T+0k>R#4bNh6d;( zD*Ln7_T1u2*>$lyeRPeC2mTNQN1t6oeCKjoTyowOo*|luO+=V~76+z$@$7mUdXOv_ zKjJ18efdevkk@*lra1`T5JYaC4Mg~(1T$Yl3>K6EV1yUeXIJlw)EqsP*v`h(LKvMj zcn;i$BB9gPtSi5^DD`bT%0Z<3yA*!RQw2iM4ENjFQQ|t$4bTVGFe8H#2ej#S7pYW~ z5y}7}9hSF`w1dlk>h^D-$?eK@ab`stsA@PMBM>h&Y_7gV9fPnH#C3K1S9p-)5+5E6GVSZla=RXt zmtYkLT{{uwB=XUx8SAy)fC;Bzr%(=*Iu-08GJJe#)4#lbdFF6?(3PZ1;7hj#4I$S7 zQSA^@4ggU=uD@EkPLf!=L%#WAqz+Y?jwnHjg_){hcZ7V|?aUyheKLjA5)o7kMrcx! zeX}jWH=r+`gQVR&YrIG{FfZwCTyll!n|rzgL~TH!7eXyvnR_FUeo%_`P}7hGNYV%r z(grSvW5cdeX)(B7e=GZJW(X4&xOwgAV<$K*FRzPhT=a6x;v#n#Rv*Meh$Y%i5R3zj zu}!4y^#*jeHrbU>&_Np86GMm#mP1++YhMGZwSg?Y_+=vnL@~l}hy|_b_Y&qmNC_jD zCbNA{-D1=lOuJELoDjqUbqT$dS;mOyVQA7!qKh!<;09PtA7h(F!YWZKM_ygVys-8043jeG}NY_9de7j?zV#lBhA>KsNi zf4oM|9I)KMgFP^J9AJmdgF1vKSZ5&&x_*NS=85!mbuDV!9l4`Dw-ca8?y-W9@0LK5 zJt&!MS-mn7!-jWQj+?@jO!Tf~0rCc>uqKP{Gz&{|DHqbow>I-NUA2(aPs@|NGxDJ)kv?+cHd&#q-l z(^x3&YeSqxz#NxZuoEekPZvgdTrbzRzbm#q7{6f*V;48i<~nXF$F(D3`vWybX{#{S ztE~ISLGpBYt?mG=P#RJN0zd|NSN)x2$L$v zWn14To&lZR0@_K1&b@h`jCR@&f|;xN@F0NcwuzW@6sjm{WT%=DjB5EtNrmn04$C&m z?i={(9ac8Oxq*pbwCxcc_*xd=e}$F9_c9Fc-QNnze*4~gh!xZ>{_&rG{N0a_etfk5 zkNyAI|Me$7{?GmY{_(%>|D#=P|M~u#{YU%1?7!H5x_^#;FZN%f?AiXyH>sJa^J@R` z{^kC&{VVjv-|qJQIMeD&)coph-Av8r80E|T(+u=GjQ$nolfK(s_YdglfARjinD?{& zr_$pm=;^C{T}z-J0s7tk(f;c^WUsUR2;=($@Is7#xBuRJ^Et-!`TmuKJlnr8U;AYL zCC2%(?)lUGCw3-Zqu&?%Pf(9*{KcEpG5g>n^zaJ1=K21)9mywwf89T9SHn!NpI~el zpBYn>XV>79SUZQs7kjydf5Z1*p#EpZ!xfj+G{&* zRBk~m3I2Vte^$WlRVMiyD0=~ve!c&*fnhxSra;n0{~8Pb7)O{>(+Qh8MNH$V*&|;! zNRUsx!r)0MxO;SnA7col9zRIC29i5L?Dq*!#KCLpdTkT>q;Em3f7ECYL#n1b3y;PUZ0U;y-wkxNVMRh4Y%MT&;g+z7yL^UIzp15{~DwC z+K`l{J<0d0{rC2$Kihv@m@P;82EZ$h0lz*mgr=_Yj0eKdkXCy~O47IS5zsMw#P!1? z`y6zUbQaXqOp-M7e^b=@X#bU2U?8qW;l~}&E)+IByb-^Ok>Du`VRVe8O-wsBTzKGne-)x!MGfICqR)Ke~+-GSXobD@@Dcl{n$0x z85wQs&{XsA9YHP~-ziisP>%!RT6_vDdO~|xllx?pL&cBL)4ydWX!7?RhT`(19D(}Q z=M>g~ancgf3dctdqb5TEqwCsgUTSK3F!^UfehvbhJ$;9>)Isp?*2&W>O2eG%mmwwo zk(}A^U8#fmf1n&_tMuwIFihNG=F-y<<|u4PY9V#7_mEo+9d6aSzebFe`hk=7lL$yj zCw-GYeceXOIMg*?ZubVsTWXQ}{9AA-)XqRDvHP|779-U@DQBZ!>5bg-8DO6q@s%s| zQ3xv;nc+?a>KY$e-G$s(=kXV?rEh}|TU|*;`VkHie~;5EUwR@eH9V&LdayqasmCX4)r`AqC!fyE(Ke8@Z(m<)%em9 zjz(ML*P{;^TT|o3{tt%W<;c`=JY5TSx`A`-h6>ke!~Mj-e!e}r^WuWv|m%t&axdV-#Hb8z96hOzY1 z5W=YGDCOf=YO9#}8ryn1R#H;`j8VFC(e*_gxf?gBg&S{OZfp&)$hxjlLJU4N9Evk? z+G1UPvU}XRK#Mfk=dR)RsP3v21K2hD(2aotG-*3^+J84|AGiurk&cb9ye|A0$C*7V ze}5q#C*LFS()051{?CBpyck)6D(Dwsh{&0yzDTEuwWR&GR7I0wuG{rUa3M^RS zVdW%h+*}FH>!sQAGL4d$NDh8^vG<4YK~!z>=*?`y$NQf4|6^ za(5?ONuD~VuW$vwq0!Gk6ThRiE6MN5gSqc{N1#e{o<~7Lu+%AUkhsqd(U_NrO~rBA zB+p_O>oy@Lhz)4Qlw?TG5!UzpH&Wv(%=~%B`8nWLTBgmE@J`_kTk4)V^%*l`_+kGE zX{C;1Oa$Y9eCupT&ho#pc_IQMw2?>IB{ zom#dIB>ya|HV9EW$ku7b(^UtsAWhD=#JfCqetB=1yXWh=(>#G0!g&hKWB71m+N^@b zGOs{DMT$nz7Ze>TcnZZ!gwV9RdT3XnD8Zxa?-c6p{P+I2fA&`XQ+J>Rf40saWj?7& zSLXriYD|&I$;(uo(ut0Xk=i(71c5u%!h{Yd`v3Th!DSQKpC?qx+IXdLS7KSik7uqIGFqI(I2 zJ0epzmFb_X=u=n&X#wW8_SZg{hF(Z%R}S4F*^!kOG_n9!U9~RSm*5A{1<8|)L*vZ) zhDAMk$IQbbAP4%;MN=bx!N;nUY*hs$QGWs?Lz*_?K%m^PFSg;~f6_Kb<*M#Aj{;(q z^o8rILPa`Jly=>)X#k_0hg#_OVe|P+hDoh3x3XV^HuG(4SoWjaFFvL(JqlBgi)o0<=j8Pf(ruH|m1NrfO|y6e9hlNcQ(Z`8G=yDc z8BGr)P&rkBVmECRG;PEIwreV4zo~U1a-01cfBQK5janwQEJVb{H>+h>=utMx;aqBD z@RkGvciwaFN1C@I%6{%hD($&#bA)B}+jrkF0sMdSZo7xo?*G2~&hERn+vTI(^EuM6 z@1Ad}<;`mcy$7^=xG72&B#i1vozzBHD!+LxkIw_J`>74f+REcVgKhajthije;{aPU@CHTQZ&koJDLrj)U5(P!@1%z8+B3zhpT(WJJzRldvw7Noe z(Q5qAH^NqX$h}sBjhyX=f6>Uc8X`MEkX~3Or6)2L*00-nwTivk##w#%$6yfEbc6if z$aL7$b)%P4gf{IyFIMFR`g6s8_H5wsIVgMWZa~6zAEqs8cPNgu91`DoD&;Y5eTk)gB)cfYGbvRaB4m7MS%T_BI?u|{YWGx0MhOhO z!DMH>O866O2u_B@@fTb%+3X_3qNy-Zh?d)G^AHtugImRARIiPqYBoYIkmw+Pwt-j< zLJ;yF|EZ-&e}`;1oY$`s;x!Q;v_G@)5!N0AxIMaMNQDn69&0=+Bx*Vbxx!voO1YRJ zyr7WOw0A|GxP1xzd6>c81_?P9IbgDCIinmkacFd^ESp2fgDGb)rw=yeW*y4$D$#@X z46OoL+0tNB77~R;W>o>?z|4mqyj5ucd{lq%R_V)4e|0b_K_u+Gu%fmdl^sJ-QuhE%Z+fe;(%Xlr;e;z%;&zss8P&2CqW6t~2UM<1Rq7o6lUSp-2|yaNbOP(&cGins9fvaT!vU6OH1W zyA~A;th3QWC=*k#y_sO=6b@Cl-S-rswe!S2i?IN>?G}Kg#c~aDt+21QgNjmKP~VG% zf5dQV)fimJAxbr1NE{W}_5n3*8B-o=qSXdYVX}sGKvg?mED5q%8C3z2{A$%XTj*YQ zs+b|iRLr@Ha;V=hR<_p~nGRL>NurWFZbyjni7>K=)Qs!z-G{s9dOMI3yW_Ix_9gUC zC2P%Pvwr9RQGQh4L92nKxtunT3w5GJe~@@18l}?WEhYC+-7_ObO*a?WQEIwMmMUYI z9}O4toG{0$a+z2i*47Jb<;5zQt=juxP)^RJt5pRmV=^*Q(u)I%y+s>syR*185X$uw z$6Bpby|uYo+YASw0@ZXZ3`4wBtfuY^2Vlimy`H-f5vTN zQ*MXg8Zk8IPm-=P9Y!{wtI+&}*<-hv=}Zh#Hq?i49Xb=SPmUg~Snw~gm&j@LyB3cd zPVkG2GP6MingQd3b7-mAu|ss2T4A-a!-10~@&%}e2%Iy|AcC)uFG`ShUG*SPY-1+v zfl|H6X*YT0#vb}p_nbZsBdx@ zLsEC+KeL5is6MecwLegc)$L-+n(hNEci%Wlj;wW8OO z`S>ZA9t*;^@Rh6G`wPAH+KC|G{N zt!>#GN49L!R_s+S6*-O*$CsqaL%yn@zp%e#ztc0gaL(65WlN?+fA{I`IeohO^ttuv zx}zqn<5f5X42t+(c1RY~bMRXOG1N+UWU1rTVGq%deJx>|uDZ#!gh3#AE<@|Tnq-K&r%vR@I166H)G zuOHOGP}Ot-Me8`0e=ssLOBfl4*KjtxCboDMWv>B(ZiO2p{8vYjDS+kaqU)I#OSddaMdVec%Z3mFh;4BfG3c?vxpTdn^M@+2}>*70g_4r2(zBRoFl2TU(-W$;yFS&R9 z4n%7;S9LH{-s9#rEXH*ln)(<(8=RY2Y+FvCEqby+g4$L{Sz`x^O@M%BBFYI~2sKa) z9r$dhe^S&eVVSGJ!2y%)pdBLar3ma7F*RtXW{GaIN>~C5L-_JP{K&Gom;21O<_^*=ta4oYLRa~uYQM8?|I{v5vZVJiB7v*Z?CU`=2quM=Cmf+mH2qapf+s1`GbuQt( z$>(|V6{M&im8KR1Q>Z9lN{cu=N$j22AqX9kCVoTFL1vi{8PB5lO+JchZZR2|+z@E` ze*yE@uYrnCyQ;)0uwDfwodEYif)b);T!aKGmb?0rd0pNHha?7`rVfYXO-nlS22@AX z0n>8LBk#m21R}!ft>e4pVRyQUamEgI3t27g1W?#wH2+k`P10FDTXz znJ`-hjPWYHb^^%+!pTnYg7A?@A;oH)f1F$^Fib?*?}?k*zTNEKOnuH2pY%0Nua3!5 z%zFj&^g)iLR(6|m3UAQ1Yhc#e_X4a=P9z9FO&_i{GC$aXZP=FB7Y!y@DQfD7Qh;-Z zO@30W9k5VEnRbTP#K}@wJoWA2pkjVm$cxMY%a=<+pyKmtF?3Rh=8YX(3!xikf8ikI zUovMWdBZyB#CNoq9ys8qO6H^+e$(sd{Zxg*OOyia4Ukkzq9RIa`DX)H5g;|`eaUnM ze2weoh&b+eT0em_BQ|l(2$bv!BNwjbC}D}*5G-wXiXrI|QIkqw16H;vfdvx*RQi)L z>}II_2Y$tY@36%6hpH#u#72P zUt+Q*tG@Q=|Z>APVG*vk+8g8T1_Tlv^hb8rHX#!*re_#uHj$6Sk zJA0)Rg5aaTt9oUp;%mx%72PmTY*13n{c&tisVnYw+f(BLsIAb`&1AgjyXagoQ&_4G^QuONm#m?RYA14j#O))FIA8#+k5e8I`1%IqpzQ*8f)6 z_5-J^WuYZNOBL|fe|ZR2#nn=^56THl2_i``?mOO7j9r?5liFZSa1_=Znh?uxYop@> zb2cCWm60=nj1^~s-d8&PN5eOVsbVdr92`mY0YnU!$^zV~+wr=pez%HDNO}czoU4wR z4YjmnNZG>pxX6kd6&o@Qasd?k9ns;C9-z3X;nu^lkt`T2e`y%s$C+$tXo0n?__5Kn zXrVzmOOFI2uwgZh1cIA93L+HG_9L0VU?9@#r0ds(HQOf1X}}7pmY3gAEE`2s%s{!J zxH@twYG+<0Q+bsLUbH_`$mnDMj7;VDSl@*4T7Hq8C0ojnST9yS>)GkA;^s9)s)iMP3hG-z3h7j>b ztgmzz$G6+Ab~E9Q732~hSF+Rz;cElBUspq^#`nysf8ew>+6j>N;qX`6Rdhjhs&9JY z&GR-a%lvM$;+2(H>7f+2YBf#q1wF1dT$^e=ij;}N4MrZ_4Xo1HUQnb+k$MRgC1sq7 z(O^29k{XDE6_ovylqoVf7(@k@$uhjOzPR%AFdGu%rcLQ>Csde|Jymr&ew&!8P+kcU zilneKe+X4@E+cx5A=IeoQ@^2$ptN~Ah~|SWeFq$8sCy!@Y~r#69jOyP)c(1K<7ula zIOJB5$TUg0ugp4zqGIcZ2SKCLHG37|78)oYVy z=YK)M_Ek?E=!u+vrrgQ!nWn-v=}uW)jiL>Sa#J75P-}0i(mHk&ZuTe^7T>FQ8=7H= z)i7HZmTaP_L4~WciL83s9t9^vD5`a~XR((S%Mg(@H^9Y|`#~8-5MmM7;3{z97?M5_ z8>QK&2N9wUeaTBZ&eni68z*EZ)F-{Dynmh+_(a=;p;E^PNJrV;q3Ga(5;2m9Kf-~% zTXlmLAPt$))esbIaIM*RM$IlJPsW(A0H;l&0ua{H^%;b@})Sd=XG6FW!+hYJtd(fn5CMv;>`=;i=sy5MvH93ihm7T zF%}svigd}LzmyiJNU%6F5shmo0l+XHHwAfU!h!qIz;LV(|@!2?8O6)2zTxTPpolZ(D46~S%Rew+>gNEF|~MM zr8vh4D`1-sb_uh!7r!S<_Aa*xwdpQCX0Dg64!~IYbJWV~s*;8CL=mf{#4p?f&epn0 zz8)XvITRR`<711LVPPZAeijZ3o8y4_EaPJ%HRxWb@t+=R;vG~hR8rn%3x5NbjS$lb zITSoh(Ld1Y0rWpO6turTZz$&i zd~YNsKmbNu)r;9Q;x;m{a3b-Efh_Ui*bHPTR2#?)8FP$bWV{(06v+uF79-oLSvSbM zlV^}g^Xn-Vk{V@NRyDPl246zdCyl!+aCUX1CKN*A)cnC9#+t$0Ab$dg?@OK`x(dZ% z1i4J3xRmK~KrKEpBerQ!YLD>S64#$^vsl%!+bqbIg!1q0*}N>_#ZqzAeIe4sqF_P*%u!qsbty0;-jZ$e-CViqy%2{V)zS;7Wxn_%(Y?TbnHF305 zP0iWf*pUn;*)_Iuo369mCyKy_*P=r8aI`z?k4ID0ZEx1Q)|=+nhzkGQyME&*g--u^ zPDOXL-ycQMq(9oXf3Mmf^+vn>-q2pf8@)K5T<;0G_Dc2fet&;Aub29GJUG0OBHoT( zj3&`&HwXJhZ+5U4=A@r9f?x*JrnCI7ccOov*^$2zU9$tr+eT}XjH&(mgAb{HQO0Spafdnj3zJlUpm5O zwT{6|MqX#johlPRu}rsn{M(^@B%NsY0BbDoLs-s-*MAM#v;IqawvVkXdXCKD=m<=u zU)VjortBr)kO^?FU)W1`PnKD(>Yzd)DvT#RYZVYS+Q-f`tl~gjNm+LFqAoXdWC4Vq(}S+n=!vJ@SR}MgZe_rSwa3ke)MAe$edAj)MQdG==pzN`Bl0; zcl+_9Q6H-#pT5{M$$wzb<{&zpNzYVF$hZ-fECsrtza`zkt6A2mPD9*ZlY(NW=`H$57~C&Po@EdDYVN60}o zUcN2`Mg5uej9O>g=XUtVR@R8GW?{8;-f$6R(H=WKkM`RKvk192$2a;n4~>X0z-F9f zKiZ8ZgTYv21O_z%gppAwv_I^DUk-=;DS!Bft&c?b>CGUoqSi~j^I}3y!_D5{@HuI4 zv)`W?>53r%5gXE4PB)!?G_ww{-8&ffXLj-=l4nlut@vU8X8iDa{4jnvi60t#dswnI zYSa!7F$yca1=m4uG_$tHQriVj#oU8$t*y1a-X2+NX;pS^t@k767CUj%<~S64dw=oo zjk=*^%oRfBWCoLiQZg;vI)4NTe53M zks6(7e(4$`&~uFDpQwYxLE3^P zy&Uz8e#S?)R0-^zuBq=i9T~;oNTjG0_Vzy4R0Mk^qa;j|frJN>BODv{i9qFObgefU z*sF-(VTaBiK7DQe{rsD!Z_K}*e_g;Yug$-h|84%q>}JbW{L}o~r~g%W`hUv&vDAP1 z>eHVWp589t_s8?U;O9H(>`(aR`}y}zfBy9Ki@SSl`jBRSM6X|=hp*81Yt`^Ql>XVk zzCt~8KL4ul^v?Py^tUj!?**5qw`FM0(ga_5dI#fr1$aC*#Q9q?l#9RiKECng{OhOx zG5-qR`v%{>7{POs@botR{C|A@t+Xx3e}6}hUz@%jtFe6m^jUM(SAfBn z=;3?(fT&5yKZ4x}I!-#jtv+!9vuC+;xv~*HukXw4q8``1Pt@1Z8@303Dg}|9`Yva+n|#f*vNT zzS5%!1)s8mH?5d+%B{M(5#i+QPh|+^25mG(exjxgMGTnbhyg2< zZ1TjSMz27`-}BSEl7%7JFr&o!OpkWQA`YRZp6Xis-Hk&3?4x0Ha|rd3$iICtK95en z$f?!AtRKKyRhagAvwxg=jrhBR2==h)us_JDX3m`{4982nvS^k1!~K5Vhae-Kelf`H z!=HcWpx4+avDfQR2w464lj~7;oys`tWdgnAZo4 zoXa!NW@WZl==AqscHKP?iy9R0g%qPYO0CSjg(gER+R4QAqkrKruNDZE&)SH!9mou3# z@4`8cNG8L zQX$=%c~y*4&;E(-EevokKDpW3U4EsI?3|P?`ai~MiR_s4s>lg2W#dhMf_$o%W));4bDA+BW3hL(h#H=Q$fNKj!kmRk+<&x zl$F$5S#aeeus%BnSL?oyrvy|nuI=hu;AIyN`61b3k~K&5RYhNjBr_>>6cAZtx7cq55)k&I{8X8Kp?_@k*(z0#T4TwW5Lo>Tb0|3Y)5|;pxV$ zO(demr8zY?7txK#u%XJ4d{loez^%ISrmBqauMlw(Y;^OF=Wot`Ie##J2mgMO{fbHQ zh2%76-_igo+|?)|e?(Bz+24^h%`NN13#~4@Fn?h_!(QV6KyDf6h<9YUA!}SN(49Ws zBu}5?wgnzI(vc`8RML{g>HKYcOQlstZ<@NYv;G#E?V;HDhx7ZGhqv+PUHtp&;`|d7 zeLjDXosJ#HueFO;iW|5&e)?Xq;@8e@XY17cYR9&T@Pd7N11WNM+#;yqgo>jkIpc6Q zE`P+eF6YORfP)y2yk^Iu27FU27tp zV@GG8Sc_TDWz&lsCAn-`9!RjT>9q$LFJ#jX=I_mac_EXo;Mly)c{KPH9&9LXg!QhC zRU@D1GxBO&F8D`ywS#Mpc2?ai<9}|0jaNGr-0ZlJSL0lk*Xhzua(Fc|FALB9e{pLx zwQy_^6fb7VBx$2Gw6bK=E91xlxQHQ3oqT>QH5faV@_&RITZZ*ayjZ?vVZ|#@mdgm_ zLPl&V-ujy0V^8$nTqbM1OHgHqApamNN>c)9r?&)H!?H)k;g!q3xL3Ft5MyV+yER zaE0)TWFq9U*G@OA`Q7+9OBOVMBB&q2Ny>H1zLbOEBBP4F1eYk4L~lG?c=PIBmx!xio$RS)Ha00?J|>qfPd$;l3ty&5AhVZ zw;kdRhE8LcJ`*Gr`Ab15@BVatZ~p%LEzyCYg_#3BO943>(tZ@kt%&}COCVAKHz*X# zS>wQ_ik!mPUIYMj%B>ak%iV^@N`(ziX>Cb|)izF2!5}$S8TL*$#UENyJ6qvAx!Enf zHCpm_m8AFW5Ko=kW`BbcJ5_qK_#_9WXu6WrOerdh+3=Y#V|UZ3b{u&KCH|lpe~=wG_THQGUw=WVc^5nIclddC{!X?I zPUT`{$8*nK!y|_qex*sYr{x(PZXm^oe%~1ID@am_J8Bvz8Jt}_7p=2G$l2ZXJiMFK zitl)M2}GfW8k^wtO{cY`_@@wd0~VDgu0uhE41{A#-h0+bP?VXoU>?@km?T#|bd4f% z4PG!imRG5r?SE}C&f-Y7%*qFtjg$Ew=AW?{Y2ZCI9OLC8o?}o;ekC)>w{^zGbV(uw zr5kKHo3O)VKhbalCw_|wRYsz!gAc753TU8b!WvWz{xvR1HHOk%Jj3R0GLVKMag2AGnF1Tx!kH#6V{eowq_g z!w$5wZGSw0rMN+QOeA{6``8$7!-4Vk{L}e;dRUzO^@?};UQP5aJM96iZ_`yKf-PNw zczg`4Y$ruMtcAt+4xT=uY{}>$n|S%mwy;BDU`wXKs3EZ5*F*glcDiNAP!bjH8RrAr zN}kIiENY?iDW4jdl$D|KQ@R_B-gnWgNAs$6aX2&-%c0?=1pc5LGu*5-qh zFLCQBQf#IA@&yNRN@V^p8Du3S zPv1xs?wnIPA$dK10}rODc{c3G^+b9?5_Ncy4F0NG9q&dahGg3YSxrt8?*n&2t%}O0 zFn>Rreh}!?bRy%0c%0F&d5aWfW)I2~&Hy@&bfAFiak`Vqcv2{j_w*g6OUfwSWBk9F;ew?&Ij?_(XtcYi9M4@ooEt+RGp zcpjUTKY8cLub#YxpOYd3?;yQHe9sSdkYk*D4EhuOno+&pr}*PVfhIDX+pwqI{eN&$ z@w%Ky$SsWb2^dUH7*>uqzdWBTC6n4ljj=o#;|?d;1l_i`n+lh~B3gC@!>oS_stq-F$ z!9Ph0M8=B*nxr}&haz?H1RV0jX@7u;DtUAMIcWkbOj8&CaKh*EQu691>?~~GoPOvM znj$K}t?KH2rRMDDV$_A*4Us~W6jw;8Cr^@wfrgaaosduod-VZ+KGO|0y)Hq>BgiAc z4WaT0c;jzjySzVtQ$vFqjO>iklsYLH*r;G-C1`p(@D%@R_Pn};=NCvJ-hZ&^lH&OG zj?2oOZj*K5u&(hO6UD;SrB6PRg9;n#Er!c6#iYT;=2V^#~qg}a1j^C7yJzbQ+gYOYs=}Sdv`A@ z`SViqvQjrM!G!}6q4rbBMdqIHcUf7&(US`JyVMH94rFRVd1bM=^yHn(PgMBG zrA;rs-Q3>slzB-oC&YblSsSP@AUqP(30siRG?%!nQ3;${(;@t4TYp=*AaQ<+KYw}h z{gb~w`R2**vi&=g{X@xnQ3#?Ny$Rx}Rp9lH6iOCx#e`4lAyXcTy~uVbTSd*wP8Ne3 z!)%EOCw?g^9PN+yM&q;hcX=Qli5I=tl7=!xAsiQ*B7x-T59U;aKmMhlCTo!cwTsqO4ORLw}Ax8J)iN zqe5dm+!O6M>P>e~U(2?fT6F2tySVG1Dl1eI#ry1pRu|JiwhNNTR=7mA8koOV|CiH-0TBsT`8N1^0ssK0m+giD9hYB(0SA9kZ<{a>exJ1eV0jODAqkL_ zrY<0Lo%*&;+9vH`sw#q=;MVp<*rBAqerHV5cB-aDB;dRA=lj0Y9fwRhsulhReYm1e5M#<4|~%;IIb%Cx>5;|_LgwusZk3S&=_yM`^!X7PEJ zTwtIPa@#nT#zgO`cB|*Hg!hjJNPwoc&aqPwlr-7q3)!xBLaSw`9MAYZQI z3qFCht@o`!YmAbg2KCoa{GOLlI`rlmdTiSddZH~%x%6{Gp{JE{%=bC*mLw$SvO5;~ zeVCV9!@Ts9GM{61sLSUa8)3t`XV=O*O{YznWIi!2d~R5t2!^+JbUUhoe^2Ef00030{{sL}O9PkL zh5-u+`6iMZc>(|csh91B0VRJ=+b|S;pS1sAc@KT*M-nI$lSE=nyp2iQq&-Xsxv|?A zY~Lt$L&~q;b(|KM(6p*e;(L#e?>+aVd2ckqpLMJ&=&rTQRkbwS&5WvAaIo>S3JmLv zrXN3yNca~LHXBt*7H=C!x%Djt|e&0x&5)FJER zAXG|m#ug((+DTiAX@BaRI_=)S?mh4GJonstp8LN4-1Dxg<(YagEmW7~yBoZeW$-IG z^BW@R&2MPd%Smz@qNg0`+SoGG@hcC;SFnQ!C+HTo-gS6<;v~1m{@Iw7*)vGt?~9n;sUCifJ5KEGB?akKlny@>P&!lSNqprU#VLZdR?&R}-9FAY zf{KXxZJl3h&pvf_%r5U4DeAa7vO19Zh`= z#jmLW#N5AdXC0D@k_hg(#t(E};r>ug9kaNa^q}@!Opc%YS+T;v^U>>do@Yk)ZaYKC z+CpM83w+6kewt&)_HDh$Mf(QRF5SWsrdykbLv(~iym`zutZn$=IAM-V5GIrG>?WxU zdHmw>>CLK)rx_+;9&$nINgu^7u{b}Z=@C`!qicA}58}E&&3J3JQ0h<1li>BmFO+Se zKW!uapm_3eto6EmWG}~xqsLlraIq3CR_Z55?(8^`we6Kb*nzkLK~`I%+D-DYX@Xc> zGUBJRz_9$dlq5epQV9p2WCHbu(<~s-Rc>(Q0ZP-fPFa?u6D{DxwEb}T`Hk~sNaRJFD?i|j0q51N{Abxc| zo#0#e{sd$0E^{50t{A-T=AR_A$u;X9a$sYT3}%W#+7QWI*AgJAyB~_FJM)OYqOC1Mk05IM0he$Z;aRn*Qi% zP;1reX|ebFH{wCkFfv|`rB(phJ!WJSRn%dm!O%=vnAbS};YhcG9{>D-O_ZrsrS0i% zp~G)8IR4S$+2p+*PTpPA(5lug1Xst%TZ7tr+A$ZHlusQ`FGCNcl_t>`9(sHEmsEp)aYZm0yNMx_%8d-NfKMAl#s+&6$h8KhML zbE7Y1TnUx=24T#EiZ$F2Y)=u-vOV>@yH9OVE@D5?UM zm_81CQU!?E`?&x%3sBN8)xZw3D-R}A1AmOL5VlpL(Xxx5qHCdb4azYqg26Sw!syeB h0|-)#UebzhP8U@S3u}N2Cb0w#*8npW*D@4_{0lJ}Z0P_1 diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/ru/functions b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/ru/functions index 7f9ce7832..9f05d5afa 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/ru/functions +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/ru/functions @@ -177,6 +177,7 @@ SYD = АСЧ TBILLEQ = РАВНОКЧЕК TBILLPRICE = ЦЕНАКЧЕК TBILLYIELD = ДОХОДКЧЕК +USDOLLAR = ДОЛЛСША VDB = ПУО XIRR = ЧИСТВНДОХ XNPV = ЧИСТНЗ @@ -231,6 +232,7 @@ AREAS = ОБЛАСТИ CHOOSE = ВЫБОР COLUMN = СТОЛБЕЦ COLUMNS = ЧИСЛСТОЛБ +FILTER = ФИЛЬТР FORMULATEXT = Ф.ТЕКСТ GETPIVOTDATA = ПОЛУЧИТЬ.ДАННЫЕ.СВОДНОЙ.ТАБЛИЦЫ HLOOKUP = ГПР @@ -243,8 +245,13 @@ OFFSET = СМЕЩ ROW = СТРОКА ROWS = ЧСТРОК RTD = ДРВ +SORT = СОРТ +SORTBY = СОРТПО TRANSPOSE = ТРАНСП +UNIQUE = УНИК VLOOKUP = ВПР +XLOOKUP = ПРОСМОТРX +XMATCH = ПОИСКПОЗX ## ## Математические и тригонометрические функции (Math & Trig Functions) @@ -302,6 +309,7 @@ PRODUCT = ПРОИЗВЕД QUOTIENT = ЧАСТНОЕ RADIANS = РАДИАНЫ RAND = СЛЧИС +RANDARRAY = СЛУЧМАССИВ RANDBETWEEN = СЛУЧМЕЖДУ ROMAN = РИМСКОЕ ROUND = ОКРУГЛ @@ -312,6 +320,7 @@ ROUNDUP = ОКРУГЛВВЕРХ SEC = SEC SECH = SECH SERIESSUM = РЯД.СУММ +SEQUENCE = ПОСЛЕДОВ SIGN = ЗНАК SIN = SIN SINH = SINH @@ -447,27 +456,36 @@ Z.TEST = Z.ТЕСТ ## ## Текстовые функции (Text Functions) ## +ARRAYTOTEXT = МАССИВВТЕКСТ BAHTTEXT = БАТТЕКСТ CHAR = СИМВОЛ CLEAN = ПЕЧСИМВ CODE = КОДСИМВ CONCAT = СЦЕП +DBCS = БДЦС DOLLAR = РУБЛЬ EXACT = СОВПАД FIND = НАЙТИ +FINDB = НАЙТИБ FIXED = ФИКСИРОВАННЫЙ -ISTHAIDIGIT = TAYRAKAMIYSA +ISTHAIDIGIT = ЕТАЙЦИФРЫ LEFT = ЛЕВСИМВ +LEFTB = ЛЕВБ LEN = ДЛСТР +LENB = ДЛИНБ LOWER = СТРОЧН MID = ПСТР +MIDB = ПСТРБ NUMBERSTRING = СТРОКАЧИСЕЛ NUMBERVALUE = ЧЗНАЧ PROPER = ПРОПНАЧ REPLACE = ЗАМЕНИТЬ +REPLACEB = ЗАМЕНИТЬБ REPT = ПОВТОР RIGHT = ПРАВСИМВ +RIGHTB = ПРАВБ SEARCH = ПОИСК +SEARCHB = ПОИСКБ SUBSTITUTE = ПОДСТАВИТЬ T = Т TEXT = ТЕКСТ @@ -481,6 +499,7 @@ UNICHAR = ЮНИСИМВ UNICODE = UNICODE UPPER = ПРОПИСН VALUE = ЗНАЧЕН +VALUETOTEXT = ЗНАЧЕНИЕВТЕКСТ ## ## Веб-функции (Web Functions) diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/Cell.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/Cell.php index 5a9def375..fe4a1f41a 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/Cell.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/Cell.php @@ -2,10 +2,13 @@ namespace PhpOffice\PhpSpreadsheet\Cell; +use DateTime; use PhpOffice\PhpSpreadsheet\Calculation\Calculation; use PhpOffice\PhpSpreadsheet\Collection\Cells; use PhpOffice\PhpSpreadsheet\Exception; use PhpOffice\PhpSpreadsheet\RichText\RichText; +use PhpOffice\PhpSpreadsheet\Shared\Date as SharedDate; +use PhpOffice\PhpSpreadsheet\Style\ConditionalFormatting\CellStyleAssessor; use PhpOffice\PhpSpreadsheet\Style\NumberFormat; use PhpOffice\PhpSpreadsheet\Style\Style; use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet; @@ -234,6 +237,22 @@ class Cell case DataType::TYPE_BOOL: $this->value = (bool) $value; + break; + case DataType::TYPE_ISO_DATE: + if (!is_string($value)) { + throw new Exception('Non-string supplied for datatype Date'); + } + $date = new DateTime($value); + $newValue = SharedDate::PHPToExcel($date); + if ($newValue === false) { + throw new Exception("Invalid string $value supplied for datatype Date"); + } + if (preg_match('/^\\d\\d:\\d\\d:\\d\\d/', $value) == 1) { + $newValue = fmod($newValue, 1.0); + } + $this->value = $newValue; + $dataType = DataType::TYPE_NUMERIC; + break; case DataType::TYPE_ERROR: $this->value = DataType::checkErrorCode($value); @@ -541,14 +560,30 @@ class Cell /** * Get cell style. - * - * @return Style */ - public function getStyle() + public function getStyle(): Style { return $this->getWorksheet()->getStyle($this->getCoordinate()); } + /** + * Get cell style. + */ + public function getAppliedStyle(): Style + { + if ($this->getWorksheet()->conditionalStylesExists($this->getCoordinate()) === false) { + return $this->getStyle(); + } + $range = $this->getWorksheet()->getConditionalRange($this->getCoordinate()); + if ($range === null) { + return $this->getStyle(); + } + + $matcher = new CellStyleAssessor($this, $range); + + return $matcher->matchConditions($this->getWorksheet()->getConditionalStyles($this->getCoordinate())); + } + /** * Re-bind parent. * diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/DataType.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/DataType.php index cee3e1e5e..0f7efe2a4 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/DataType.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/DataType.php @@ -16,6 +16,7 @@ class DataType const TYPE_NULL = 'null'; const TYPE_INLINE = 'inlineStr'; const TYPE_ERROR = 'e'; + const TYPE_ISO_DATE = 'd'; /** * List of error codes. diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls.php index 5f96dcfcd..1644e40ec 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls.php @@ -7912,4 +7912,17 @@ class Xls extends BaseReader return $value; } + + /** + * Phpstan 1.4.4 complains that this property is never read. + * So, we might be able to get rid of it altogether. + * For now, however, this function makes it readable, + * which satisfies Phpstan. + * + * @codeCoverageIgnore + */ + public function getMapCellStyleXfIndex(): array + { + return $this->mapCellStyleXfIndex; + } } diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php index 6b2c2fd6e..f7625d5e1 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php @@ -149,6 +149,7 @@ class Xlsx extends BaseReader private const REL_TO_MAIN = [ Namespaces::PURL_OFFICE_DOCUMENT => Namespaces::PURL_MAIN, + Namespaces::THUMBNAIL => '', ]; private const REL_TO_DRAWING = [ @@ -538,16 +539,14 @@ class Xlsx extends BaseReader if ($xpath === null) { $xmlStyles = self::testSimpleXml(null); } else { - // I think Nonamespace is okay because I'm using xpath. - $xmlStyles = $this->loadZipNonamespace("$dir/$xpath[Target]", $mainNS); + $xmlStyles = $this->loadZip("$dir/$xpath[Target]", $mainNS); } - $xmlStyles->registerXPathNamespace('smm', Namespaces::MAIN); - $fills = self::xpathNoFalse($xmlStyles, 'smm:fills/smm:fill'); - $fonts = self::xpathNoFalse($xmlStyles, 'smm:fonts/smm:font'); - $borders = self::xpathNoFalse($xmlStyles, 'smm:borders/smm:border'); - $xfTags = self::xpathNoFalse($xmlStyles, 'smm:cellXfs/smm:xf'); - $cellXfTags = self::xpathNoFalse($xmlStyles, 'smm:cellStyleXfs/smm:xf'); + $fills = self::extractStyles($xmlStyles, 'fills', 'fill'); + $fonts = self::extractStyles($xmlStyles, 'fonts', 'font'); + $borders = self::extractStyles($xmlStyles, 'borders', 'border'); + $xfTags = self::extractStyles($xmlStyles, 'cellXfs', 'xf'); + $cellXfTags = self::extractStyles($xmlStyles, 'cellStyleXfs', 'xf'); $styles = []; $cellStyles = []; @@ -558,6 +557,7 @@ class Xlsx extends BaseReader if (isset($numFmts) && ($numFmts !== null)) { $numFmts->registerXPathNamespace('sml', $mainNS); } + $this->styleReader->setNamespace($mainNS); if (!$this->readDataOnly/* && $xmlStyles*/) { foreach ($xfTags as $xfTag) { $xf = self::getAttributes($xfTag); @@ -642,6 +642,7 @@ class Xlsx extends BaseReader } } $this->styleReader->setStyleXml($xmlStyles); + $this->styleReader->setNamespace($mainNS); $this->styleReader->setStyleBaseData($theme, $styles, $cellStyles); $dxfs = $this->styleReader->dxfs($this->readDataOnly); $styles = $this->styleReader->styles(); @@ -708,9 +709,12 @@ class Xlsx extends BaseReader $xmlSheetMain = $xmlSheetNS->children($mainNS); // Setting Conditional Styles adjusts selected cells, so we need to execute this // before reading the sheet view data to get the actual selected cells - if (!$this->readDataOnly && $xmlSheet->conditionalFormatting) { + if (!$this->readDataOnly && ($xmlSheet->conditionalFormatting)) { (new ConditionalStyles($docSheet, $xmlSheet, $dxfs))->load(); } + if (!$this->readDataOnly && $xmlSheet->extLst) { + (new ConditionalStyles($docSheet, $xmlSheet, $dxfs))->loadFromExt($this->styleReader); + } if (isset($xmlSheetMain->sheetViews, $xmlSheetMain->sheetViews->sheetView)) { $sheetViews = new SheetViews($xmlSheetMain->sheetViews->sheetView, $docSheet); $sheetViews->load(); @@ -767,7 +771,12 @@ class Xlsx extends BaseReader break; case 'b': if (!isset($c->f)) { - $value = self::castToBoolean($c); + if (isset($c->v)) { + $value = self::castToBoolean($c); + } else { + $value = null; + $cellDataType = DATATYPE::TYPE_NULL; + } } else { // Formula $this->castToFormula($c, $r, $cellDataType, $value, $calculatedValue, $sharedFormulas, 'castToBoolean'); @@ -821,10 +830,12 @@ class Xlsx extends BaseReader // Assign value if ($cellDataType != '') { // it is possible, that datatype is numeric but with an empty string, which result in an error - if ($cellDataType === DataType::TYPE_NUMERIC && $value === '') { - $cellDataType = DataType::TYPE_STRING; + if ($cellDataType === DataType::TYPE_NUMERIC && ($value === '' || $value === null)) { + $cellDataType = DataType::TYPE_NULL; + } + if ($cellDataType !== DataType::TYPE_NULL) { + $cell->setValueExplicit($value, $cellDataType); } - $cell->setValueExplicit($value, $cellDataType); } else { $cell->setValue($value); } @@ -1250,8 +1261,8 @@ class Xlsx extends BaseReader $objDrawing->setOffsetX((int) Drawing::EMUToPixels($oneCellAnchor->from->colOff)); $objDrawing->setOffsetY(Drawing::EMUToPixels($oneCellAnchor->from->rowOff)); $objDrawing->setResizeProportional(false); - $objDrawing->setWidth(Drawing::EMUToPixels(self::getArrayItem((int) self::getAttributes($oneCellAnchor->ext), 'cx'))); - $objDrawing->setHeight(Drawing::EMUToPixels(self::getArrayItem((int) self::getAttributes($oneCellAnchor->ext), 'cy'))); + $objDrawing->setWidth(Drawing::EMUToPixels(self::getArrayItem(self::getAttributes($oneCellAnchor->ext), 'cx'))); + $objDrawing->setHeight(Drawing::EMUToPixels(self::getArrayItem(self::getAttributes($oneCellAnchor->ext), 'cy'))); if ($xfrm) { $objDrawing->setRotation((int) Drawing::angleToDegrees(self::getArrayItem(self::getAttributes($xfrm), 'rot'))); } @@ -1680,13 +1691,17 @@ class Xlsx extends BaseReader } else { $objText = $value->createTextRun(StringHelper::controlCharacterOOXML2PHP((string) $run->t)); - $attr = $run->rPr->rFont->attributes(); - if (isset($attr['val'])) { - $objText->getFont()->setName((string) $attr['val']); + if (isset($run->rPr->rFont)) { + $attr = $run->rPr->rFont->attributes(); + if (isset($attr['val'])) { + $objText->getFont()->setName((string) $attr['val']); + } } - $attr = $run->rPr->sz->attributes(); - if (isset($attr['val'])) { - $objText->getFont()->setSize((float) $attr['val']); + if (isset($run->rPr->sz)) { + $attr = $run->rPr->sz->attributes(); + if (isset($attr['val'])) { + $objText->getFont()->setSize((float) $attr['val']); + } } if (isset($run->rPr->color)) { $objText->getFont()->setColor(new Color($this->styleReader->readColor($run->rPr->color))); @@ -2077,4 +2092,16 @@ class Xlsx extends BaseReader } } } + + private static function extractStyles(?SimpleXMLElement $sxml, string $node1, string $node2): array + { + $array = []; + if ($sxml && $sxml->{$node1}->{$node2}) { + foreach ($sxml->{$node1}->{$node2} as $node) { + $array[] = $node; + } + } + + return $array; + } } diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/AutoFilter.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/AutoFilter.php index b88f90567..fdc56ce12 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/AutoFilter.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/AutoFilter.php @@ -22,7 +22,7 @@ class AutoFilter public function load(): void { // Remove all "$" in the auto filter range - $autoFilterRange = preg_replace('/\$/', '', $this->worksheetXml->autoFilter['ref']); + $autoFilterRange = preg_replace('/\$/', '', $this->worksheetXml->autoFilter['ref'] ?? ''); if (strpos($autoFilterRange, ':') !== false) { $this->readAutoFilter($autoFilterRange, $this->worksheetXml); } diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/ConditionalStyles.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/ConditionalStyles.php index dcd7ad12c..ce1e1e63e 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/ConditionalStyles.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/ConditionalStyles.php @@ -2,10 +2,12 @@ namespace PhpOffice\PhpSpreadsheet\Reader\Xlsx; +use PhpOffice\PhpSpreadsheet\Reader\Xlsx\Styles as StyleReader; use PhpOffice\PhpSpreadsheet\Style\Conditional; use PhpOffice\PhpSpreadsheet\Style\ConditionalFormatting\ConditionalDataBar; use PhpOffice\PhpSpreadsheet\Style\ConditionalFormatting\ConditionalFormattingRuleExtension; use PhpOffice\PhpSpreadsheet\Style\ConditionalFormatting\ConditionalFormatValueObject; +use PhpOffice\PhpSpreadsheet\Style\Style as Style; use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet; use SimpleXMLElement; @@ -15,6 +17,11 @@ class ConditionalStyles private $worksheetXml; + /** + * @var array + */ + private $ns; + private $dxfs; public function __construct(Worksheet $workSheet, SimpleXMLElement $worksheetXml, array $dxfs = []) @@ -33,7 +40,113 @@ class ConditionalStyles ); } - private function readConditionalStyles($xmlSheet) + public function loadFromExt(StyleReader $styleReader): void + { + $this->ns = $this->worksheetXml->getNamespaces(true); + $this->setConditionalsFromExt( + $this->readConditionalsFromExt($this->worksheetXml->extLst, $styleReader) + ); + } + + private function setConditionalsFromExt(array $conditionals): void + { + foreach ($conditionals as $conditionalRange => $cfRules) { + ksort($cfRules); + // Priority is used as the key for sorting; but may not start at 0, + // so we use array_values to reset the index after sorting. + $this->worksheet->getStyle($conditionalRange) + ->setConditionalStyles(array_values($cfRules)); + } + } + + private function readConditionalsFromExt(SimpleXMLElement $extLst, StyleReader $styleReader): array + { + $conditionals = []; + + if (isset($extLst->ext['uri']) && (string) $extLst->ext['uri'] === '{78C0D931-6437-407d-A8EE-F0AAD7539E65}') { + $conditionalFormattingRuleXml = $extLst->ext->children($this->ns['x14']); + if (!$conditionalFormattingRuleXml->conditionalFormattings) { + return []; + } + + foreach ($conditionalFormattingRuleXml->children($this->ns['x14']) as $extFormattingXml) { + $extFormattingRangeXml = $extFormattingXml->children($this->ns['xm']); + if (!$extFormattingRangeXml->sqref) { + continue; + } + + $sqref = (string) $extFormattingRangeXml->sqref; + $extCfRuleXml = $extFormattingXml->cfRule; + + $attributes = $extCfRuleXml->attributes(); + if (!$attributes) { + continue; + } + $conditionType = (string) $attributes->type; + if ( + !Conditional::isValidConditionType($conditionType) || + $conditionType === Conditional::CONDITION_DATABAR + ) { + continue; + } + + $priority = (int) $attributes->priority; + + $conditional = $this->readConditionalRuleFromExt($extCfRuleXml, $attributes); + $cfStyle = $this->readStyleFromExt($extCfRuleXml, $styleReader); + $conditional->setStyle($cfStyle); + $conditionals[$sqref][$priority] = $conditional; + } + } + + return $conditionals; + } + + private function readConditionalRuleFromExt(SimpleXMLElement $cfRuleXml, SimpleXMLElement $attributes): Conditional + { + $conditionType = (string) $attributes->type; + $operatorType = (string) $attributes->operator; + + $operands = []; + foreach ($cfRuleXml->children($this->ns['xm']) as $cfRuleOperandsXml) { + $operands[] = (string) $cfRuleOperandsXml; + } + + $conditional = new Conditional(); + $conditional->setConditionType($conditionType); + $conditional->setOperatorType($operatorType); + if ( + $conditionType === Conditional::CONDITION_CONTAINSTEXT || + $conditionType === Conditional::CONDITION_NOTCONTAINSTEXT || + $conditionType === Conditional::CONDITION_BEGINSWITH || + $conditionType === Conditional::CONDITION_ENDSWITH || + $conditionType === Conditional::CONDITION_TIMEPERIOD + ) { + $conditional->setText(array_pop($operands) ?? ''); + } + $conditional->setConditions($operands); + + return $conditional; + } + + private function readStyleFromExt(SimpleXMLElement $extCfRuleXml, StyleReader $styleReader): Style + { + $cfStyle = new Style(false, true); + if ($extCfRuleXml->dxf) { + $styleXML = $extCfRuleXml->dxf->children(); + + if ($styleXML->borders) { + $styleReader->readBorderStyle($cfStyle->getBorders(), $styleXML->borders); + } + if ($styleXML->fill) { + $styleReader->readFillStyle($cfStyle->getFill(), $styleXML->fill); + } + } + + return $cfStyle; + } + + private function readConditionalStyles($xmlSheet): array { $conditionals = []; foreach ($xmlSheet->conditionalFormatting as $conditional) { @@ -51,12 +164,12 @@ class ConditionalStyles private function setConditionalStyles(Worksheet $worksheet, array $conditionals, $xmlExtLst): void { - foreach ($conditionals as $ref => $cfRules) { + foreach ($conditionals as $cellRangeReference => $cfRules) { ksort($cfRules); $conditionalStyles = $this->readStyleRules($cfRules, $xmlExtLst); - // Extract all cell references in $ref - $cellBlocks = explode(' ', str_replace('$', '', strtoupper($ref))); + // Extract all cell references in $cellRangeReference + $cellBlocks = explode(' ', str_replace('$', '', strtoupper($cellRangeReference))); foreach ($cellBlocks as $cellBlock) { $worksheet->getStyle($cellBlock)->setConditionalStyles($conditionalStyles); } @@ -67,6 +180,7 @@ class ConditionalStyles { $conditionalFormattingRuleExtensions = ConditionalFormattingRuleExtension::parseExtLstXml($extLst); $conditionalStyles = []; + foreach ($cfRules as $cfRule) { $objConditional = new Conditional(); $objConditional->setConditionType((string) $cfRule['type']); @@ -74,6 +188,8 @@ class ConditionalStyles if ((string) $cfRule['text'] != '') { $objConditional->setText((string) $cfRule['text']); + } elseif ((string) $cfRule['timePeriod'] != '') { + $objConditional->setText((string) $cfRule['timePeriod']); } if (isset($cfRule['stopIfTrue']) && (int) $cfRule['stopIfTrue'] === 1) { diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/Namespaces.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/Namespaces.php index 54f56d724..c0713ae4a 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/Namespaces.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/Namespaces.php @@ -14,6 +14,8 @@ class Namespaces // This one used in Reader\Xlsx\Properties const CORE_PROPERTIES2 = 'http://schemas.openxmlformats.org/package/2006/metadata/core-properties'; + const THUMBNAIL = 'http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail'; + const THEME = 'http://schemas.openxmlformats.org/package/2006/relationships/theme'; const COMPATIBILITY = 'http://schemas.openxmlformats.org/markup-compatibility/2006'; diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/Styles.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/Styles.php index 6f01c7457..65dac529f 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/Styles.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/Styles.php @@ -33,6 +33,37 @@ class Styles extends BaseParserClass /** @var SimpleXMLElement */ private $styleXml; + /** @var string */ + private $namespace = ''; + + public function setNamespace(string $namespace): void + { + $this->namespace = $namespace; + } + + /** + * Cast SimpleXMLElement to bool to overcome Scrutinizer problem. + * + * @param mixed $value + */ + private static function castBool($value): bool + { + return (bool) $value; + } + + private function getStyleAttributes(SimpleXMLElement $value): SimpleXMLElement + { + $attr = null; + if (self::castBool($value)) { + $attr = $value->attributes(''); + if ($attr === null || count($attr) === 0) { + $attr = $value->attributes($this->namespace); + } + } + + return Xlsx::testSimpleXml($attr); + } + public function setStyleXml(SimpleXmlElement $styleXml): void { $this->styleXml = $styleXml; @@ -52,48 +83,62 @@ class Styles extends BaseParserClass public function readFontStyle(Font $fontStyle, SimpleXMLElement $fontStyleXml): void { - if (isset($fontStyleXml->name, $fontStyleXml->name['val'])) { - $fontStyle->setName((string) $fontStyleXml->name['val']); + if (isset($fontStyleXml->name)) { + $attr = $this->getStyleAttributes($fontStyleXml->name); + if (isset($attr['val'])) { + $fontStyle->setName((string) $attr['val']); + } } - if (isset($fontStyleXml->sz, $fontStyleXml->sz['val'])) { - $fontStyle->setSize((float) $fontStyleXml->sz['val']); + if (isset($fontStyleXml->sz)) { + $attr = $this->getStyleAttributes($fontStyleXml->sz); + if (isset($attr['val'])) { + $fontStyle->setSize((float) $attr['val']); + } } if (isset($fontStyleXml->b)) { - $fontStyle->setBold(!isset($fontStyleXml->b['val']) || self::boolean((string) $fontStyleXml->b['val'])); + $attr = $this->getStyleAttributes($fontStyleXml->b); + $fontStyle->setBold(!isset($attr['val']) || self::boolean((string) $attr['val'])); } if (isset($fontStyleXml->i)) { - $fontStyle->setItalic(!isset($fontStyleXml->i['val']) || self::boolean((string) $fontStyleXml->i['val'])); + $attr = $this->getStyleAttributes($fontStyleXml->i); + $fontStyle->setItalic(!isset($attr['val']) || self::boolean((string) $attr['val'])); } if (isset($fontStyleXml->strike)) { - $fontStyle->setStrikethrough( - !isset($fontStyleXml->strike['val']) || self::boolean((string) $fontStyleXml->strike['val']) - ); + $attr = $this->getStyleAttributes($fontStyleXml->strike); + $fontStyle->setStrikethrough(!isset($attr['val']) || self::boolean((string) $attr['val'])); } $fontStyle->getColor()->setARGB($this->readColor($fontStyleXml->color)); - if (isset($fontStyleXml->u) && !isset($fontStyleXml->u['val'])) { - $fontStyle->setUnderline(Font::UNDERLINE_SINGLE); - } elseif (isset($fontStyleXml->u, $fontStyleXml->u['val'])) { - $fontStyle->setUnderline((string) $fontStyleXml->u['val']); + if (isset($fontStyleXml->u)) { + $attr = $this->getStyleAttributes($fontStyleXml->u); + if (!isset($attr['val'])) { + $fontStyle->setUnderline(Font::UNDERLINE_SINGLE); + } else { + $fontStyle->setUnderline((string) $attr['val']); + } } - - if (isset($fontStyleXml->vertAlign, $fontStyleXml->vertAlign['val'])) { - $verticalAlign = strtolower((string) $fontStyleXml->vertAlign['val']); - if ($verticalAlign === 'superscript') { - $fontStyle->setSuperscript(true); - } elseif ($verticalAlign === 'subscript') { - $fontStyle->setSubscript(true); + if (isset($fontStyleXml->vertAlign)) { + $attr = $this->getStyleAttributes($fontStyleXml->vertAlign); + if (!isset($attr['val'])) { + $verticalAlign = strtolower((string) $attr['val']); + if ($verticalAlign === 'superscript') { + $fontStyle->setSuperscript(true); + } elseif ($verticalAlign === 'subscript') { + $fontStyle->setSubscript(true); + } } } } private function readNumberFormat(NumberFormat $numfmtStyle, SimpleXMLElement $numfmtStyleXml): void { - if ($numfmtStyleXml->count() === 0) { + if ((string) $numfmtStyleXml['formatCode'] !== '') { + $numfmtStyle->setFormatCode(self::formatGeneral((string) $numfmtStyleXml['formatCode'])); + return; } - $numfmt = Xlsx::getAttributes($numfmtStyleXml); - if ($numfmt->count() > 0 && isset($numfmt['formatCode'])) { + $numfmt = $this->getStyleAttributes($numfmtStyleXml); + if (isset($numfmt['formatCode'])) { $numfmtStyle->setFormatCode(self::formatGeneral((string) $numfmt['formatCode'])); } } @@ -103,10 +148,11 @@ class Styles extends BaseParserClass if ($fillStyleXml->gradientFill) { /** @var SimpleXMLElement $gradientFill */ $gradientFill = $fillStyleXml->gradientFill[0]; - if (!empty($gradientFill['type'])) { - $fillStyle->setFillType((string) $gradientFill['type']); + $attr = $this->getStyleAttributes($gradientFill); + if (!empty($attr['type'])) { + $fillStyle->setFillType((string) $attr['type']); } - $fillStyle->setRotation((float) ($gradientFill['degree'])); + $fillStyle->setRotation((float) ($attr['degree'])); $gradientFill->registerXPathNamespace('sml', Namespaces::MAIN); $fillStyle->getStartColor()->setARGB($this->readColor(self::getArrayItem($gradientFill->xpath('sml:stop[@position=0]'))->color)); $fillStyle->getEndColor()->setARGB($this->readColor(self::getArrayItem($gradientFill->xpath('sml:stop[@position=1]'))->color)); @@ -121,9 +167,14 @@ class Styles extends BaseParserClass $defaultFillStyle = Fill::FILL_SOLID; } - $patternType = (string) $fillStyleXml->patternFill['patternType'] != '' - ? (string) $fillStyleXml->patternFill['patternType'] - : $defaultFillStyle; + $type = ''; + if ((string) $fillStyleXml->patternFill['patternType'] !== '') { + $type = (string) $fillStyleXml->patternFill['patternType']; + } else { + $attr = $this->getStyleAttributes($fillStyleXml->patternFill); + $type = (string) $attr['patternType']; + } + $patternType = ($type === '') ? $defaultFillStyle : $type; $fillStyle->setFillType($patternType); } @@ -131,8 +182,10 @@ class Styles extends BaseParserClass public function readBorderStyle(Borders $borderStyle, SimpleXMLElement $borderStyleXml): void { - $diagonalUp = self::boolean((string) $borderStyleXml['diagonalUp']); - $diagonalDown = self::boolean((string) $borderStyleXml['diagonalDown']); + $diagonalUp = $this->getAttribute($borderStyleXml, 'diagonalUp'); + $diagonalUp = self::boolean($diagonalUp); + $diagonalDown = $this->getAttribute($borderStyleXml, 'diagonalDown'); + $diagonalDown = self::boolean($diagonalDown); if (!$diagonalUp && !$diagonalDown) { $borderStyle->setDiagonalDirection(Borders::DIAGONAL_NONE); } elseif ($diagonalUp && !$diagonalDown) { @@ -150,10 +203,26 @@ class Styles extends BaseParserClass $this->readBorder($borderStyle->getDiagonal(), $borderStyleXml->diagonal); } + private function getAttribute(SimpleXMLElement $xml, string $attribute): string + { + $style = ''; + if ((string) $xml[$attribute] !== '') { + $style = (string) $xml[$attribute]; + } else { + $attr = $this->getStyleAttributes($xml); + if (isset($attr[$attribute])) { + $style = (string) $attr[$attribute]; + } + } + + return $style; + } + private function readBorder(Border $border, SimpleXMLElement $borderXml): void { - if (isset($borderXml['style'])) { - $border->setBorderStyle((string) $borderXml['style']); + $style = $this->getAttribute($borderXml, 'style'); + if ($style !== '') { + $border->setBorderStyle((string) $style); } if (isset($borderXml->color)) { $border->getColor()->setARGB($this->readColor($borderXml->color)); @@ -162,25 +231,25 @@ class Styles extends BaseParserClass public function readAlignmentStyle(Alignment $alignment, SimpleXMLElement $alignmentXml): void { - $alignment->setHorizontal((string) $alignmentXml['horizontal']); - $alignment->setVertical((string) $alignmentXml['vertical']); + $horizontal = $this->getAttribute($alignmentXml, 'horizontal'); + $alignment->setHorizontal($horizontal); + $vertical = $this->getAttribute($alignmentXml, 'vertical'); + $alignment->setVertical((string) $vertical); - $textRotation = 0; - if ((int) $alignmentXml['textRotation'] <= 90) { - $textRotation = (int) $alignmentXml['textRotation']; - } elseif ((int) $alignmentXml['textRotation'] > 90) { - $textRotation = 90 - (int) $alignmentXml['textRotation']; + $textRotation = (int) $this->getAttribute($alignmentXml, 'textRotation'); + if ($textRotation > 90) { + $textRotation = 90 - $textRotation; } + $alignment->setTextRotation($textRotation); - $alignment->setTextRotation((int) $textRotation); - $alignment->setWrapText(self::boolean((string) $alignmentXml['wrapText'])); - $alignment->setShrinkToFit(self::boolean((string) $alignmentXml['shrinkToFit'])); - $alignment->setIndent( - (int) ((string) $alignmentXml['indent']) > 0 ? (int) ((string) $alignmentXml['indent']) : 0 - ); - $alignment->setReadOrder( - (int) ((string) $alignmentXml['readingOrder']) > 0 ? (int) ((string) $alignmentXml['readingOrder']) : 0 - ); + $wrapText = $this->getAttribute($alignmentXml, 'wrapText'); + $alignment->setWrapText(self::boolean((string) $wrapText)); + $shrinkToFit = $this->getAttribute($alignmentXml, 'shrinkToFit'); + $alignment->setShrinkToFit(self::boolean((string) $shrinkToFit)); + $indent = (int) $this->getAttribute($alignmentXml, 'indent'); + $alignment->setIndent(max($indent, 0)); + $readingOrder = (int) $this->getAttribute($alignmentXml, 'readingOrder'); + $alignment->setReadOrder(max($readingOrder, 0)); } private static function formatGeneral(string $formatString): string @@ -223,8 +292,8 @@ class Styles extends BaseParserClass // protection if (isset($style->protection)) { - $this->readProtectionLocked($docStyle, $style); - $this->readProtectionHidden($docStyle, $style); + $this->readProtectionLocked($docStyle, $style->protection); + $this->readProtectionHidden($docStyle, $style->protection); } // top-level style settings @@ -235,13 +304,20 @@ class Styles extends BaseParserClass /** * Read protection locked attribute. - * - * @param SimpleXMLElement|stdClass $style */ - public function readProtectionLocked(Style $docStyle, $style): void + public function readProtectionLocked(Style $docStyle, SimpleXMLElement $style): void { - if (isset($style->protection['locked'])) { - if (self::boolean((string) $style->protection['locked'])) { + $locked = ''; + if ((string) $style['locked'] !== '') { + $locked = (string) $style['locked']; + } else { + $attr = $this->getStyleAttributes($style); + if (isset($attr['locked'])) { + $locked = (string) $attr['locked']; + } + } + if ($locked !== '') { + if (self::boolean($locked)) { $docStyle->getProtection()->setLocked(Protection::PROTECTION_PROTECTED); } else { $docStyle->getProtection()->setLocked(Protection::PROTECTION_UNPROTECTED); @@ -251,13 +327,20 @@ class Styles extends BaseParserClass /** * Read protection hidden attribute. - * - * @param SimpleXMLElement|stdClass $style */ - public function readProtectionHidden(Style $docStyle, $style): void + public function readProtectionHidden(Style $docStyle, SimpleXMLElement $style): void { - if (isset($style->protection['hidden'])) { - if (self::boolean((string) $style->protection['hidden'])) { + $hidden = ''; + if ((string) $style['hidden'] !== '') { + $hidden = (string) $style['hidden']; + } else { + $attr = $this->getStyleAttributes($style); + if (isset($attr['hidden'])) { + $hidden = (string) $attr['hidden']; + } + } + if ($hidden !== '') { + if (self::boolean((string) $hidden)) { $docStyle->getProtection()->setHidden(Protection::PROTECTION_PROTECTED); } else { $docStyle->getProtection()->setHidden(Protection::PROTECTION_UNPROTECTED); @@ -267,15 +350,18 @@ class Styles extends BaseParserClass public function readColor(SimpleXMLElement $color, bool $background = false): string { - if (isset($color['rgb'])) { - return (string) $color['rgb']; - } elseif (isset($color['indexed'])) { - return Color::indexedColor((int) ($color['indexed'] - 7), $background)->getARGB() ?? ''; - } elseif (isset($color['theme'])) { + $attr = $this->getStyleAttributes($color); + if (isset($attr['rgb'])) { + return (string) $attr['rgb']; + } + if (isset($attr['indexed'])) { + return Color::indexedColor((int) ($attr['indexed'] - 7), $background)->getARGB() ?? ''; + } + if (isset($attr['theme'])) { if ($this->theme !== null) { - $returnColour = $this->theme->getColourByIndex((int) $color['theme']); - if (isset($color['tint'])) { - $tintAdjust = (float) $color['tint']; + $returnColour = $this->theme->getColourByIndex((int) $attr['theme']); + if (isset($attr['tint'])) { + $tintAdjust = (float) $attr['tint']; $returnColour = Color::changeBrightness($returnColour ?? '', $tintAdjust); } diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/ReferenceHelper.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/ReferenceHelper.php index 0d72b3055..98c4807a2 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/ReferenceHelper.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/ReferenceHelper.php @@ -398,6 +398,26 @@ class ReferenceHelper } } + // Find missing coordinates. This is important when inserting column before the last column + $missingCoordinates = array_filter( + array_map(function ($row) use ($highestColumn) { + return $highestColumn . $row; + }, range(1, $highestRow)), + function ($coordinate) use ($allCoordinates) { + return !in_array($coordinate, $allCoordinates); + } + ); + + // Create missing cells with null values + if (!empty($missingCoordinates)) { + foreach ($missingCoordinates as $coordinate) { + $worksheet->createNewCell($coordinate); + } + + // Refresh all coordinates + $allCoordinates = $worksheet->getCoordinates(); + } + // Loop through cells, bottom-up, and change cell coordinate if ($remove) { // It's faster to reverse and pop than to use unshift, especially with large cell collections diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Date.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Date.php index 5b0a2907a..b4cf1913a 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Date.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Date.php @@ -228,7 +228,7 @@ class Date * @param mixed $dateValue PHP DateTime object or a string - Unix timestamp is also permitted, but discouraged; * not Y2038-safe on a 32-bit system, and no timezone info * - * @return bool|float Excel date/time value + * @return false|float Excel date/time value * or boolean FALSE on failure */ public static function PHPToExcel($dateValue) diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/JAMA/EigenvalueDecomposition.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/JAMA/EigenvalueDecomposition.php index 5c6ccfd3a..66111b6c8 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/JAMA/EigenvalueDecomposition.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/JAMA/EigenvalueDecomposition.php @@ -415,7 +415,7 @@ class EigenvalueDecomposition $norm = 0.0; for ($i = 0; $i < $nn; ++$i) { - if (($i < $low) || ($i > $high)) { + if ($i > $high) { $this->d[$i] = $this->H[$i][$i]; $this->e[$i] = 0.0; } @@ -762,7 +762,7 @@ class EigenvalueDecomposition // Vectors of isolated roots for ($i = 0; $i < $nn; ++$i) { - if ($i < $low | $i > $high) { + if ($i > $high) { for ($j = $i; $j < $nn; ++$j) { $this->V[$i][$j] = $this->H[$i][$j]; } diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/OLE/PPS/Root.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/OLE/PPS/Root.php index 7a31d77f6..fa92fd5db 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/OLE/PPS/Root.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/OLE/PPS/Root.php @@ -71,12 +71,12 @@ class Root extends PPS $this->fileHandle = $fileHandle; // Initial Setting for saving - $this->bigBlockSize = 2 ** ( + $this->bigBlockSize = (int) (2 ** ( (isset($this->bigBlockSize)) ? self::adjust2($this->bigBlockSize) : 9 - ); - $this->smallBlockSize = 2 ** ( + )); + $this->smallBlockSize = (int) (2 ** ( (isset($this->smallBlockSize)) ? self::adjust2($this->smallBlockSize) : 6 - ); + )); // Make an array of PPS's (for Save) $aList = []; diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/StringHelper.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/StringHelper.php index 435d0e4cd..9970a2115 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/StringHelper.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/StringHelper.php @@ -49,7 +49,7 @@ class StringHelper /** * Is iconv extension avalable? * - * @var bool + * @var ?bool */ private static $isIconvEnabled; diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Trend/Trend.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Trend/Trend.php index 61d1183ab..1162284b2 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Trend/Trend.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Trend/Trend.php @@ -72,6 +72,7 @@ class Trend case self::TREND_POWER: if (!isset(self::$trendCache[$key])) { $className = '\PhpOffice\PhpSpreadsheet\Shared\Trend\\' . $trendType . 'BestFit'; + // @phpstan-ignore-next-line self::$trendCache[$key] = new $className($yValues, $xValues, $const); } diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Spreadsheet.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Spreadsheet.php index 350ba652f..2b8c8360b 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Spreadsheet.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Spreadsheet.php @@ -313,7 +313,7 @@ class Spreadsheet break; case 'target': case 'data': - if (is_array($this->ribbonXMLData) && isset($this->ribbonXMLData[$what])) { + if (is_array($this->ribbonXMLData)) { $returnData = $this->ribbonXMLData[$what]; } @@ -608,7 +608,7 @@ class Spreadsheet /** * Add sheet. * - * @param Worksheet $worksheet The worskeet to add + * @param Worksheet $worksheet The worksheet to add * @param null|int $sheetIndex Index where sheet should go (0,1,..., or null for last) * * @return Worksheet diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Color.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Color.php index c2d4f7490..6fd91c64f 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Color.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Color.php @@ -26,10 +26,24 @@ class Color extends Supervisor const COLOR_DARKGREEN = 'FF008000'; const COLOR_YELLOW = 'FFFFFF00'; const COLOR_DARKYELLOW = 'FF808000'; + const COLOR_MAGENTA = 'FFFF00FF'; + const COLOR_CYAN = 'FF00FFFF'; + + const NAMED_COLOR_TRANSLATIONS = [ + 'Black' => self::COLOR_BLACK, + 'White' => self::COLOR_WHITE, + 'Red' => self::COLOR_RED, + 'Green' => self::COLOR_GREEN, + 'Blue' => self::COLOR_BLUE, + 'Yellow' => self::COLOR_YELLOW, + 'Magenta' => self::COLOR_MAGENTA, + 'Cyan' => self::COLOR_CYAN, + ]; const VALIDATE_ARGB_SIZE = 8; const VALIDATE_RGB_SIZE = 6; - const VALIDATE_COLOR_VALUE = '/^[A-F0-9]{%d}$/i'; + const VALIDATE_COLOR_6 = '/^[A-F0-9]{6}$/i'; + const VALIDATE_COLOR_8 = '/^[A-F0-9]{8}$/i'; /** * Indexed colors array. @@ -66,7 +80,7 @@ class Color extends Supervisor // Initialise values if (!$isConditional) { - $this->argb = $this->validateColor($colorValue, self::VALIDATE_ARGB_SIZE) ? $colorValue : self::COLOR_BLACK; + $this->argb = $this->validateColor($colorValue) ?: self::COLOR_BLACK; } } @@ -135,10 +149,23 @@ class Color extends Supervisor return $this; } - private function validateColor(string $colorValue, int $size): bool + private function validateColor(?string $colorValue): string { - return in_array(ucfirst(strtolower($colorValue)), self::NAMED_COLORS) || - preg_match(sprintf(self::VALIDATE_COLOR_VALUE, $size), $colorValue); + if ($colorValue === null || $colorValue === '') { + return self::COLOR_BLACK; + } + $named = ucfirst(strtolower($colorValue)); + if (array_key_exists($named, self::NAMED_COLOR_TRANSLATIONS)) { + return self::NAMED_COLOR_TRANSLATIONS[$named]; + } + if (preg_match(self::VALIDATE_COLOR_8, $colorValue) === 1) { + return $colorValue; + } + if (preg_match(self::VALIDATE_COLOR_6, $colorValue) === 1) { + return 'FF' . $colorValue; + } + + return ''; } /** @@ -163,9 +190,8 @@ class Color extends Supervisor public function setARGB(?string $colorValue = self::COLOR_BLACK) { $this->hasChanged = true; - if ($colorValue === '' || $colorValue === null) { - $colorValue = self::COLOR_BLACK; - } elseif (!$this->validateColor($colorValue, self::VALIDATE_ARGB_SIZE)) { + $colorValue = $this->validateColor($colorValue); + if ($colorValue === '') { return $this; } @@ -200,21 +226,7 @@ class Color extends Supervisor */ public function setRGB(?string $colorValue = self::COLOR_BLACK) { - $this->hasChanged = true; - if ($colorValue === '' || $colorValue === null) { - $colorValue = '000000'; - } elseif (!$this->validateColor($colorValue, self::VALIDATE_RGB_SIZE)) { - return $this; - } - - if ($this->isSupervisor) { - $styleArray = $this->getStyleArray(['argb' => 'FF' . $colorValue]); - $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); - } else { - $this->argb = 'FF' . $colorValue; - } - - return $this; + return $this->setARGB($colorValue); } /** diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Conditional.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Conditional.php index e148ee82b..e67964c2c 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Conditional.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Conditional.php @@ -9,23 +9,37 @@ class Conditional implements IComparable { // Condition types const CONDITION_NONE = 'none'; + const CONDITION_BEGINSWITH = 'beginsWith'; const CONDITION_CELLIS = 'cellIs'; - const CONDITION_CONTAINSTEXT = 'containsText'; - const CONDITION_EXPRESSION = 'expression'; const CONDITION_CONTAINSBLANKS = 'containsBlanks'; - const CONDITION_NOTCONTAINSBLANKS = 'notContainsBlanks'; + const CONDITION_CONTAINSERRORS = 'containsErrors'; + const CONDITION_CONTAINSTEXT = 'containsText'; const CONDITION_DATABAR = 'dataBar'; + const CONDITION_ENDSWITH = 'endsWith'; + const CONDITION_EXPRESSION = 'expression'; + const CONDITION_NOTCONTAINSBLANKS = 'notContainsBlanks'; + const CONDITION_NOTCONTAINSERRORS = 'notContainsErrors'; const CONDITION_NOTCONTAINSTEXT = 'notContainsText'; + const CONDITION_TIMEPERIOD = 'timePeriod'; + const CONDITION_DUPLICATES = 'duplicateValues'; + const CONDITION_UNIQUE = 'uniqueValues'; private const CONDITION_TYPES = [ + self::CONDITION_BEGINSWITH, self::CONDITION_CELLIS, self::CONDITION_CONTAINSBLANKS, + self::CONDITION_CONTAINSERRORS, self::CONDITION_CONTAINSTEXT, self::CONDITION_DATABAR, + self::CONDITION_DUPLICATES, + self::CONDITION_ENDSWITH, self::CONDITION_EXPRESSION, self::CONDITION_NONE, self::CONDITION_NOTCONTAINSBLANKS, + self::CONDITION_NOTCONTAINSERRORS, self::CONDITION_NOTCONTAINSTEXT, + self::CONDITION_TIMEPERIOD, + self::CONDITION_UNIQUE, ]; // Operator types @@ -43,6 +57,17 @@ class Conditional implements IComparable const OPERATOR_BETWEEN = 'between'; const OPERATOR_NOTBETWEEN = 'notBetween'; + const TIMEPERIOD_TODAY = 'today'; + const TIMEPERIOD_YESTERDAY = 'yesterday'; + const TIMEPERIOD_TOMORROW = 'tomorrow'; + const TIMEPERIOD_LAST_7_DAYS = 'last7Days'; + const TIMEPERIOD_LAST_WEEK = 'lastWeek'; + const TIMEPERIOD_THIS_WEEK = 'thisWeek'; + const TIMEPERIOD_NEXT_WEEK = 'nextWeek'; + const TIMEPERIOD_LAST_MONTH = 'lastMonth'; + const TIMEPERIOD_THIS_MONTH = 'thisMonth'; + const TIMEPERIOD_NEXT_MONTH = 'nextMonth'; + /** * Condition type. * diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/CellMatcher.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/CellMatcher.php new file mode 100644 index 000000000..7d5201205 --- /dev/null +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/CellMatcher.php @@ -0,0 +1,312 @@ + '=', + Conditional::OPERATOR_GREATERTHAN => '>', + Conditional::OPERATOR_GREATERTHANOREQUAL => '>=', + Conditional::OPERATOR_LESSTHAN => '<', + Conditional::OPERATOR_LESSTHANOREQUAL => '<=', + Conditional::OPERATOR_NOTEQUAL => '<>', + ]; + + public const COMPARISON_RANGE_OPERATORS = [ + Conditional::OPERATOR_BETWEEN => 'IF(AND(A1>=%s,A1<=%s),TRUE,FALSE)', + Conditional::OPERATOR_NOTBETWEEN => 'IF(AND(A1>=%s,A1<=%s),FALSE,TRUE)', + ]; + + public const COMPARISON_DUPLICATES_OPERATORS = [ + Conditional::CONDITION_DUPLICATES => "COUNTIF('%s'!%s,%s)>1", + Conditional::CONDITION_UNIQUE => "COUNTIF('%s'!%s,%s)=1", + ]; + + /** + * @var Cell + */ + protected $cell; + + /** + * @var int + */ + protected $cellRow; + + /** + * @var Worksheet + */ + protected $worksheet; + + /** + * @var int + */ + protected $cellColumn; + + /** + * @var string + */ + protected $conditionalRange; + + /** + * @var string + */ + protected $referenceCell; + + /** + * @var int + */ + protected $referenceRow; + + /** + * @var int + */ + protected $referenceColumn; + + /** + * @var Calculation + */ + protected $engine; + + public function __construct(Cell $cell, string $conditionalRange) + { + $this->cell = $cell; + $this->worksheet = $cell->getWorksheet(); + [$this->cellColumn, $this->cellRow] = Coordinate::indexesFromString($this->cell->getCoordinate()); + $this->setReferenceCellForExpressions($conditionalRange); + + $this->engine = Calculation::getInstance($this->worksheet->getParent()); + } + + protected function setReferenceCellForExpressions(string $conditionalRange): void + { + $conditionalRange = Coordinate::splitRange(str_replace('$', '', strtoupper($conditionalRange))); + [$this->referenceCell] = $conditionalRange[0]; + + [$this->referenceColumn, $this->referenceRow] = Coordinate::indexesFromString($this->referenceCell); + + // Convert our conditional range to an absolute conditional range, so it can be used "pinned" in formulae + $rangeSets = []; + foreach ($conditionalRange as $rangeSet) { + $absoluteRangeSet = array_map( + [Coordinate::class, 'absoluteCoordinate'], + $rangeSet + ); + $rangeSets[] = implode(':', $absoluteRangeSet); + } + $this->conditionalRange = implode(',', $rangeSets); + } + + public function evaluateConditional(Conditional $conditional): bool + { + // Some calculations may modify the stored cell; so reset it before every evaluation. + $cellColumn = Coordinate::stringFromColumnIndex($this->cellColumn); + $cellAddress = "{$cellColumn}{$this->cellRow}"; + $this->cell = $this->worksheet->getCell($cellAddress); + + switch ($conditional->getConditionType()) { + case Conditional::CONDITION_CELLIS: + return $this->processOperatorComparison($conditional); + case Conditional::CONDITION_DUPLICATES: + case Conditional::CONDITION_UNIQUE: + return $this->processDuplicatesComparison($conditional); + case Conditional::CONDITION_CONTAINSTEXT: + // Expression is NOT(ISERROR(SEARCH("",))) + case Conditional::CONDITION_NOTCONTAINSTEXT: + // Expression is ISERROR(SEARCH("",)) + case Conditional::CONDITION_BEGINSWITH: + // Expression is LEFT(,LEN(""))="" + case Conditional::CONDITION_ENDSWITH: + // Expression is RIGHT(,LEN(""))="" + case Conditional::CONDITION_CONTAINSBLANKS: + // Expression is LEN(TRIM())=0 + case Conditional::CONDITION_NOTCONTAINSBLANKS: + // Expression is LEN(TRIM())>0 + case Conditional::CONDITION_CONTAINSERRORS: + // Expression is ISERROR() + case Conditional::CONDITION_NOTCONTAINSERRORS: + // Expression is NOT(ISERROR()) + case Conditional::CONDITION_TIMEPERIOD: + // Expression varies, depending on specified timePeriod value, e.g. + // Yesterday FLOOR(,1)=TODAY()-1 + // Today FLOOR(,1)=TODAY() + // Tomorrow FLOOR(,1)=TODAY()+1 + // Last 7 Days AND(TODAY()-FLOOR(,1)<=6,FLOOR(,1)<=TODAY()) + case Conditional::CONDITION_EXPRESSION: + return $this->processExpression($conditional); + } + + return false; + } + + /** + * @param mixed $value + * + * @return float|int|string + */ + protected function wrapValue($value) + { + if (!is_numeric($value)) { + if (is_bool($value)) { + return $value ? 'TRUE' : 'FALSE'; + } elseif ($value === null) { + return 'NULL'; + } + + return '"' . $value . '"'; + } + + return $value; + } + + /** + * @return float|int|string + */ + protected function wrapCellValue() + { + return $this->wrapValue($this->cell->getCalculatedValue()); + } + + /** + * @return float|int|string + */ + protected function conditionCellAdjustment(array $matches) + { + $column = $matches[6]; + $row = $matches[7]; + + if (strpos($column, '$') === false) { + $column = Coordinate::columnIndexFromString($column); + $column += $this->cellColumn - $this->referenceColumn; + $column = Coordinate::stringFromColumnIndex($column); + } + + if (strpos($row, '$') === false) { + $row += $this->cellRow - $this->referenceRow; + } + + if (!empty($matches[4])) { + $worksheet = $this->worksheet->getParent()->getSheetByName(trim($matches[4], "'")); + if ($worksheet === null) { + return $this->wrapValue(null); + } + + return $this->wrapValue( + $worksheet + ->getCell(str_replace('$', '', "{$column}{$row}")) + ->getCalculatedValue() + ); + } + + return $this->wrapValue( + $this->worksheet + ->getCell(str_replace('$', '', "{$column}{$row}")) + ->getCalculatedValue() + ); + } + + protected function cellConditionCheck(string $condition): string + { + $splitCondition = explode(Calculation::FORMULA_STRING_QUOTE, $condition); + $i = false; + foreach ($splitCondition as &$value) { + // Only count/replace in alternating array entries (ie. not in quoted strings) + if ($i = !$i) { + $value = preg_replace_callback( + '/' . Calculation::CALCULATION_REGEXP_CELLREF_RELATIVE . '/i', + [$this, 'conditionCellAdjustment'], + $value + ); + } + } + unset($value); + // Then rebuild the condition string to return it + return implode(Calculation::FORMULA_STRING_QUOTE, $splitCondition); + } + + protected function adjustConditionsForCellReferences(array $conditions): array + { + return array_map( + [$this, 'cellConditionCheck'], + $conditions + ); + } + + protected function processOperatorComparison(Conditional $conditional): bool + { + if (array_key_exists($conditional->getOperatorType(), self::COMPARISON_RANGE_OPERATORS)) { + return $this->processRangeOperator($conditional); + } + + $operator = self::COMPARISON_OPERATORS[$conditional->getOperatorType()]; + $conditions = $this->adjustConditionsForCellReferences($conditional->getConditions()); + $expression = sprintf('%s%s%s', (string) $this->wrapCellValue(), $operator, (string) array_pop($conditions)); + + return $this->evaluateExpression($expression); + } + + protected function processRangeOperator(Conditional $conditional): bool + { + $conditions = $this->adjustConditionsForCellReferences($conditional->getConditions()); + sort($conditions); + $expression = sprintf( + (string) preg_replace( + '/\bA1\b/i', + (string) $this->wrapCellValue(), + self::COMPARISON_RANGE_OPERATORS[$conditional->getOperatorType()] + ), + ...$conditions + ); + + return $this->evaluateExpression($expression); + } + + protected function processDuplicatesComparison(Conditional $conditional): bool + { + $worksheetName = $this->cell->getWorksheet()->getTitle(); + + $expression = sprintf( + self::COMPARISON_DUPLICATES_OPERATORS[$conditional->getConditionType()], + $worksheetName, + $this->conditionalRange, + $this->cellConditionCheck($this->cell->getCalculatedValue()) + ); + + return $this->evaluateExpression($expression); + } + + protected function processExpression(Conditional $conditional): bool + { + $conditions = $this->adjustConditionsForCellReferences($conditional->getConditions()); + $expression = array_pop($conditions); + + $expression = preg_replace( + '/\b' . $this->referenceCell . '\b/i', + (string) $this->wrapCellValue(), + $expression + ); + + return $this->evaluateExpression($expression); + } + + protected function evaluateExpression(string $expression): bool + { + $expression = "={$expression}"; + + try { + $this->engine->flushInstance(); + $result = (bool) $this->engine->calculateFormula($expression); + } catch (Exception $e) { + return false; + } + + return $result; + } +} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/CellStyleAssessor.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/CellStyleAssessor.php new file mode 100644 index 000000000..4c000db32 --- /dev/null +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/CellStyleAssessor.php @@ -0,0 +1,45 @@ +cellMatcher = new CellMatcher($cell, $conditionalRange); + $this->styleMerger = new StyleMerger($cell->getStyle()); + } + + /** + * @param Conditional[] $conditionalStyles + */ + public function matchConditions(array $conditionalStyles = []): Style + { + foreach ($conditionalStyles as $conditional) { + /** @var Conditional $conditional */ + if ($this->cellMatcher->evaluateConditional($conditional) === true) { + // Merging the conditional style into the base style goes in here + $this->styleMerger->mergeStyle($conditional->getStyle()); + if ($conditional->getStopIfTrue() === true) { + break; + } + } + } + + return $this->styleMerger->getStyle(); + } +} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/StyleMerger.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/StyleMerger.php new file mode 100644 index 000000000..95e6dfd8b --- /dev/null +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/StyleMerger.php @@ -0,0 +1,118 @@ +baseStyle = $baseStyle; + } + + public function getStyle(): Style + { + return $this->baseStyle; + } + + public function mergeStyle(Style $style): void + { + if ($style->getNumberFormat() !== null && $style->getNumberFormat()->getFormatCode() !== null) { + $this->baseStyle->getNumberFormat()->setFormatCode($style->getNumberFormat()->getFormatCode()); + } + + if ($style->getFont() !== null) { + $this->mergeFontStyle($this->baseStyle->getFont(), $style->getFont()); + } + + if ($style->getFill() !== null) { + $this->mergeFillStyle($this->baseStyle->getFill(), $style->getFill()); + } + + if ($style->getBorders() !== null) { + $this->mergeBordersStyle($this->baseStyle->getBorders(), $style->getBorders()); + } + } + + protected function mergeFontStyle(Font $baseFontStyle, Font $fontStyle): void + { + if ($fontStyle->getBold() !== null) { + $baseFontStyle->setBold($fontStyle->getBold()); + } + + if ($fontStyle->getItalic() !== null) { + $baseFontStyle->setItalic($fontStyle->getItalic()); + } + + if ($fontStyle->getStrikethrough() !== null) { + $baseFontStyle->setStrikethrough($fontStyle->getStrikethrough()); + } + + if ($fontStyle->getUnderline() !== null) { + $baseFontStyle->setUnderline($fontStyle->getUnderline()); + } + + if ($fontStyle->getColor() !== null && $fontStyle->getColor()->getARGB() !== null) { + $baseFontStyle->setColor($fontStyle->getColor()); + } + } + + protected function mergeFillStyle(Fill $baseFillStyle, Fill $fillStyle): void + { + if ($fillStyle->getFillType() !== null) { + $baseFillStyle->setFillType($fillStyle->getFillType()); + } + + if ($fillStyle->getRotation() !== null) { + $baseFillStyle->setRotation($fillStyle->getRotation()); + } + + if ($fillStyle->getStartColor() !== null && $fillStyle->getStartColor()->getARGB() !== null) { + $baseFillStyle->setStartColor($fillStyle->getStartColor()); + } + + if ($fillStyle->getEndColor() !== null && $fillStyle->getEndColor()->getARGB() !== null) { + $baseFillStyle->setEndColor($fillStyle->getEndColor()); + } + } + + protected function mergeBordersStyle(Borders $baseBordersStyle, Borders $bordersStyle): void + { + if ($bordersStyle->getTop() !== null) { + $this->mergeBorderStyle($baseBordersStyle->getTop(), $bordersStyle->getTop()); + } + + if ($bordersStyle->getBottom() !== null) { + $this->mergeBorderStyle($baseBordersStyle->getBottom(), $bordersStyle->getBottom()); + } + + if ($bordersStyle->getLeft() !== null) { + $this->mergeBorderStyle($baseBordersStyle->getLeft(), $bordersStyle->getLeft()); + } + + if ($bordersStyle->getRight() !== null) { + $this->mergeBorderStyle($baseBordersStyle->getRight(), $bordersStyle->getRight()); + } + } + + protected function mergeBorderStyle(Border $baseBorderStyle, Border $borderStyle): void + { + if ($borderStyle->getBorderStyle() !== null) { + $baseBorderStyle->setBorderStyle($borderStyle->getBorderStyle()); + } + + if ($borderStyle->getColor() !== null && $borderStyle->getColor()->getARGB() !== null) { + $baseBorderStyle->setColor($borderStyle->getColor()); + } + } +} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/Wizard.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/Wizard.php new file mode 100644 index 000000000..d5d56a9a3 --- /dev/null +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/Wizard.php @@ -0,0 +1,95 @@ +cellRange = $cellRange; + } + + public function newRule(string $ruleType): WizardInterface + { + switch ($ruleType) { + case self::CELL_VALUE: + return new Wizard\CellValue($this->cellRange); + case self::TEXT_VALUE: + return new Wizard\TextValue($this->cellRange); + case self::BLANKS: + return new Wizard\Blanks($this->cellRange, true); + case self::NOT_BLANKS: + return new Wizard\Blanks($this->cellRange, false); + case self::ERRORS: + return new Wizard\Errors($this->cellRange, true); + case self::NOT_ERRORS: + return new Wizard\Errors($this->cellRange, false); + case self::EXPRESSION: + case self::FORMULA: + return new Wizard\Expression($this->cellRange); + case self::DATES_OCCURRING: + return new Wizard\DateValue($this->cellRange); + case self::DUPLICATES: + return new Wizard\Duplicates($this->cellRange, false); + case self::UNIQUE: + return new Wizard\Duplicates($this->cellRange, true); + default: + throw new Exception('No wizard exists for this CF rule type'); + } + } + + public static function fromConditional(Conditional $conditional, string $cellRange = 'A1'): WizardInterface + { + $conditionalType = $conditional->getConditionType(); + + switch ($conditionalType) { + case Conditional::CONDITION_CELLIS: + return Wizard\CellValue::fromConditional($conditional, $cellRange); + case Conditional::CONDITION_CONTAINSTEXT: + case Conditional::CONDITION_NOTCONTAINSTEXT: + case Conditional::CONDITION_BEGINSWITH: + case Conditional::CONDITION_ENDSWITH: + return Wizard\TextValue::fromConditional($conditional, $cellRange); + case Conditional::CONDITION_CONTAINSBLANKS: + case Conditional::CONDITION_NOTCONTAINSBLANKS: + return Wizard\Blanks::fromConditional($conditional, $cellRange); + case Conditional::CONDITION_CONTAINSERRORS: + case Conditional::CONDITION_NOTCONTAINSERRORS: + return Wizard\Errors::fromConditional($conditional, $cellRange); + case Conditional::CONDITION_TIMEPERIOD: + return Wizard\DateValue::fromConditional($conditional, $cellRange); + case Conditional::CONDITION_EXPRESSION: + return Wizard\Expression::fromConditional($conditional, $cellRange); + case Conditional::CONDITION_DUPLICATES: + case Conditional::CONDITION_UNIQUE: + return Wizard\Duplicates::fromConditional($conditional, $cellRange); + default: + throw new Exception('No wizard exists for this CF rule type'); + } + } +} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/Blanks.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/Blanks.php new file mode 100644 index 000000000..14f30d39e --- /dev/null +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/Blanks.php @@ -0,0 +1,99 @@ + false, + 'isBlank' => true, + 'notEmpty' => false, + 'empty' => true, + ]; + + protected const EXPRESSIONS = [ + Wizard::NOT_BLANKS => 'LEN(TRIM(%s))>0', + Wizard::BLANKS => 'LEN(TRIM(%s))=0', + ]; + + /** + * @var bool + */ + protected $inverse; + + public function __construct(string $cellRange, bool $inverse = false) + { + parent::__construct($cellRange); + $this->inverse = $inverse; + } + + protected function inverse(bool $inverse): void + { + $this->inverse = $inverse; + } + + protected function getExpression(): void + { + $this->expression = sprintf( + self::EXPRESSIONS[$this->inverse ? Wizard::BLANKS : Wizard::NOT_BLANKS], + $this->referenceCell + ); + } + + public function getConditional(): Conditional + { + $this->getExpression(); + + $conditional = new Conditional(); + $conditional->setConditionType( + $this->inverse ? Conditional::CONDITION_CONTAINSBLANKS : Conditional::CONDITION_NOTCONTAINSBLANKS + ); + $conditional->setConditions([$this->expression]); + $conditional->setStyle($this->getStyle()); + $conditional->setStopIfTrue($this->getStopIfTrue()); + + return $conditional; + } + + public static function fromConditional(Conditional $conditional, string $cellRange = 'A1'): WizardInterface + { + if ( + $conditional->getConditionType() !== Conditional::CONDITION_CONTAINSBLANKS && + $conditional->getConditionType() !== Conditional::CONDITION_NOTCONTAINSBLANKS + ) { + throw new Exception('Conditional is not a Blanks CF Rule conditional'); + } + + $wizard = new self($cellRange); + $wizard->style = $conditional->getStyle(); + $wizard->stopIfTrue = $conditional->getStopIfTrue(); + $wizard->inverse = $conditional->getConditionType() === Conditional::CONDITION_CONTAINSBLANKS; + + return $wizard; + } + + /** + * @param string $methodName + * @param mixed[] $arguments + */ + public function __call($methodName, $arguments): self + { + if (!array_key_exists($methodName, self::OPERATORS)) { + throw new Exception('Invalid Operation for Blanks CF Rule Wizard'); + } + + $this->inverse(self::OPERATORS[$methodName]); + + return $this; + } +} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/CellValue.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/CellValue.php new file mode 100644 index 000000000..f36033dd1 --- /dev/null +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/CellValue.php @@ -0,0 +1,189 @@ + Conditional::OPERATOR_EQUAL, + 'notEquals' => Conditional::OPERATOR_NOTEQUAL, + 'greaterThan' => Conditional::OPERATOR_GREATERTHAN, + 'greaterThanOrEqual' => Conditional::OPERATOR_GREATERTHANOREQUAL, + 'lessThan' => Conditional::OPERATOR_LESSTHAN, + 'lessThanOrEqual' => Conditional::OPERATOR_LESSTHANOREQUAL, + 'between' => Conditional::OPERATOR_BETWEEN, + 'notBetween' => Conditional::OPERATOR_NOTBETWEEN, + ]; + + protected const SINGLE_OPERATORS = CellMatcher::COMPARISON_OPERATORS; + + protected const RANGE_OPERATORS = CellMatcher::COMPARISON_RANGE_OPERATORS; + + /** @var string */ + protected $operator = Conditional::OPERATOR_EQUAL; + + /** @var array */ + protected $operand = [0]; + + /** + * @var string[] + */ + protected $operandValueType = []; + + public function __construct(string $cellRange) + { + parent::__construct($cellRange); + } + + protected function operator(string $operator): void + { + if ((!isset(self::SINGLE_OPERATORS[$operator])) && (!isset(self::RANGE_OPERATORS[$operator]))) { + throw new Exception('Invalid Operator for Cell Value CF Rule Wizard'); + } + + $this->operator = $operator; + } + + /** + * @param mixed $operand + */ + protected function operand(int $index, $operand, string $operandValueType = Wizard::VALUE_TYPE_LITERAL): void + { + if (is_string($operand)) { + $operand = $this->validateOperand($operand, $operandValueType); + } + + $this->operand[$index] = $operand; + $this->operandValueType[$index] = $operandValueType; + } + + /** + * @param mixed $value + * + * @return float|int|string + */ + protected function wrapValue($value, string $operandValueType) + { + if (!is_numeric($value) && !is_bool($value) && null !== $value) { + if ($operandValueType === Wizard::VALUE_TYPE_LITERAL) { + return '"' . str_replace('"', '""', $value) . '"'; + } + + return $this->cellConditionCheck($value); + } + + if (null === $value) { + $value = 'NULL'; + } elseif (is_bool($value)) { + $value = $value ? 'TRUE' : 'FALSE'; + } + + return $value; + } + + public function getConditional(): Conditional + { + if (!isset(self::RANGE_OPERATORS[$this->operator])) { + unset($this->operand[1], $this->operandValueType[1]); + } + $values = array_map([$this, 'wrapValue'], $this->operand, $this->operandValueType); + + $conditional = new Conditional(); + $conditional->setConditionType(Conditional::CONDITION_CELLIS); + $conditional->setOperatorType($this->operator); + $conditional->setConditions($values); + $conditional->setStyle($this->getStyle()); + $conditional->setStopIfTrue($this->getStopIfTrue()); + + return $conditional; + } + + protected static function unwrapString(string $condition): string + { + if ((strpos($condition, '"') === 0) && (strpos(strrev($condition), '"') === 0)) { + $condition = substr($condition, 1, -1); + } + + return str_replace('""', '"', $condition); + } + + public static function fromConditional(Conditional $conditional, string $cellRange = 'A1'): WizardInterface + { + if ($conditional->getConditionType() !== Conditional::CONDITION_CELLIS) { + throw new Exception('Conditional is not a Cell Value CF Rule conditional'); + } + + $wizard = new self($cellRange); + $wizard->style = $conditional->getStyle(); + $wizard->stopIfTrue = $conditional->getStopIfTrue(); + + $wizard->operator = $conditional->getOperatorType(); + $conditions = $conditional->getConditions(); + foreach ($conditions as $index => $condition) { + // Best-guess to try and identify if the text is a string literal, a cell reference or a formula? + $operandValueType = Wizard::VALUE_TYPE_LITERAL; + if (is_string($condition)) { + if (array_key_exists($condition, Calculation::$excelConstants)) { + $condition = Calculation::$excelConstants[$condition]; + } elseif (preg_match('/^' . Calculation::CALCULATION_REGEXP_CELLREF_RELATIVE . '$/i', $condition)) { + $operandValueType = Wizard::VALUE_TYPE_CELL; + $condition = self::reverseAdjustCellRef($condition, $cellRange); + } elseif ( + preg_match('/\(\)/', $condition) || + preg_match('/' . Calculation::CALCULATION_REGEXP_CELLREF_RELATIVE . '/i', $condition) + ) { + $operandValueType = Wizard::VALUE_TYPE_FORMULA; + $condition = self::reverseAdjustCellRef($condition, $cellRange); + } else { + $condition = self::unwrapString($condition); + } + } + $wizard->operand($index, $condition, $operandValueType); + } + + return $wizard; + } + + /** + * @param string $methodName + * @param mixed[] $arguments + */ + public function __call($methodName, $arguments): self + { + if (!isset(self::MAGIC_OPERATIONS[$methodName]) && $methodName !== 'and') { + throw new Exception('Invalid Operator for Cell Value CF Rule Wizard'); + } + + if ($methodName === 'and') { + if (!isset(self::RANGE_OPERATORS[$this->operator])) { + throw new Exception('AND Value is only appropriate for range operators'); + } + + $this->operand(1, ...$arguments); + + return $this; + } + + $this->operator(self::MAGIC_OPERATIONS[$methodName]); + $this->operand(0, ...$arguments); + + return $this; + } +} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/DateValue.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/DateValue.php new file mode 100644 index 000000000..453dcdf91 --- /dev/null +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/DateValue.php @@ -0,0 +1,111 @@ + Conditional::TIMEPERIOD_YESTERDAY, + 'today' => Conditional::TIMEPERIOD_TODAY, + 'tomorrow' => Conditional::TIMEPERIOD_TOMORROW, + 'lastSevenDays' => Conditional::TIMEPERIOD_LAST_7_DAYS, + 'last7Days' => Conditional::TIMEPERIOD_LAST_7_DAYS, + 'lastWeek' => Conditional::TIMEPERIOD_LAST_WEEK, + 'thisWeek' => Conditional::TIMEPERIOD_THIS_WEEK, + 'nextWeek' => Conditional::TIMEPERIOD_NEXT_WEEK, + 'lastMonth' => Conditional::TIMEPERIOD_LAST_MONTH, + 'thisMonth' => Conditional::TIMEPERIOD_THIS_MONTH, + 'nextMonth' => Conditional::TIMEPERIOD_NEXT_MONTH, + ]; + + protected const EXPRESSIONS = [ + Conditional::TIMEPERIOD_YESTERDAY => 'FLOOR(%s,1)=TODAY()-1', + Conditional::TIMEPERIOD_TODAY => 'FLOOR(%s,1)=TODAY()', + Conditional::TIMEPERIOD_TOMORROW => 'FLOOR(%s,1)=TODAY()+1', + Conditional::TIMEPERIOD_LAST_7_DAYS => 'AND(TODAY()-FLOOR(%s,1)<=6,FLOOR(%s,1)<=TODAY())', + Conditional::TIMEPERIOD_LAST_WEEK => 'AND(TODAY()-ROUNDDOWN(%s,0)>=(WEEKDAY(TODAY())),TODAY()-ROUNDDOWN(%s,0)<(WEEKDAY(TODAY())+7))', + Conditional::TIMEPERIOD_THIS_WEEK => 'AND(TODAY()-ROUNDDOWN(%s,0)<=WEEKDAY(TODAY())-1,ROUNDDOWN(%s,0)-TODAY()<=7-WEEKDAY(TODAY()))', + Conditional::TIMEPERIOD_NEXT_WEEK => 'AND(ROUNDDOWN(%s,0)-TODAY()>(7-WEEKDAY(TODAY())),ROUNDDOWN(%s,0)-TODAY()<(15-WEEKDAY(TODAY())))', + Conditional::TIMEPERIOD_LAST_MONTH => 'AND(MONTH(%s)=MONTH(EDATE(TODAY(),0-1)),YEAR(%s)=YEAR(EDATE(TODAY(),0-1)))', + Conditional::TIMEPERIOD_THIS_MONTH => 'AND(MONTH(%s)=MONTH(TODAY()),YEAR(%s)=YEAR(TODAY()))', + Conditional::TIMEPERIOD_NEXT_MONTH => 'AND(MONTH(%s)=MONTH(EDATE(TODAY(),0+1)),YEAR(%s)=YEAR(EDATE(TODAY(),0+1)))', + ]; + + /** @var string */ + protected $operator; + + public function __construct(string $cellRange) + { + parent::__construct($cellRange); + } + + protected function operator(string $operator): void + { + $this->operator = $operator; + } + + protected function setExpression(): void + { + $referenceCount = substr_count(self::EXPRESSIONS[$this->operator], '%s'); + $references = array_fill(0, $referenceCount, $this->referenceCell); + $this->expression = sprintf(self::EXPRESSIONS[$this->operator], ...$references); + } + + public function getConditional(): Conditional + { + $this->setExpression(); + + $conditional = new Conditional(); + $conditional->setConditionType(Conditional::CONDITION_TIMEPERIOD); + $conditional->setText($this->operator); + $conditional->setConditions([$this->expression]); + $conditional->setStyle($this->getStyle()); + $conditional->setStopIfTrue($this->getStopIfTrue()); + + return $conditional; + } + + public static function fromConditional(Conditional $conditional, string $cellRange = 'A1'): WizardInterface + { + if ($conditional->getConditionType() !== Conditional::CONDITION_TIMEPERIOD) { + throw new Exception('Conditional is not a Date Value CF Rule conditional'); + } + + $wizard = new self($cellRange); + $wizard->style = $conditional->getStyle(); + $wizard->stopIfTrue = $conditional->getStopIfTrue(); + $wizard->operator = $conditional->getText(); + + return $wizard; + } + + /** + * @param string $methodName + * @param mixed[] $arguments + */ + public function __call($methodName, $arguments): self + { + if (!isset(self::MAGIC_OPERATIONS[$methodName])) { + throw new Exception('Invalid Operation for Date Value CF Rule Wizard'); + } + + $this->operator(self::MAGIC_OPERATIONS[$methodName]); + + return $this; + } +} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/Duplicates.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/Duplicates.php new file mode 100644 index 000000000..3f063fefd --- /dev/null +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/Duplicates.php @@ -0,0 +1,78 @@ + false, + 'unique' => true, + ]; + + /** + * @var bool + */ + protected $inverse; + + public function __construct(string $cellRange, bool $inverse = false) + { + parent::__construct($cellRange); + $this->inverse = $inverse; + } + + protected function inverse(bool $inverse): void + { + $this->inverse = $inverse; + } + + public function getConditional(): Conditional + { + $conditional = new Conditional(); + $conditional->setConditionType( + $this->inverse ? Conditional::CONDITION_UNIQUE : Conditional::CONDITION_DUPLICATES + ); + $conditional->setStyle($this->getStyle()); + $conditional->setStopIfTrue($this->getStopIfTrue()); + + return $conditional; + } + + public static function fromConditional(Conditional $conditional, string $cellRange = 'A1'): WizardInterface + { + if ( + $conditional->getConditionType() !== Conditional::CONDITION_DUPLICATES && + $conditional->getConditionType() !== Conditional::CONDITION_UNIQUE + ) { + throw new Exception('Conditional is not a Duplicates CF Rule conditional'); + } + + $wizard = new self($cellRange); + $wizard->style = $conditional->getStyle(); + $wizard->stopIfTrue = $conditional->getStopIfTrue(); + $wizard->inverse = $conditional->getConditionType() === Conditional::CONDITION_UNIQUE; + + return $wizard; + } + + /** + * @param string $methodName + * @param mixed[] $arguments + */ + public function __call($methodName, $arguments): self + { + if (!array_key_exists($methodName, self::OPERATORS)) { + throw new Exception('Invalid Operation for Errors CF Rule Wizard'); + } + + $this->inverse(self::OPERATORS[$methodName]); + + return $this; + } +} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/Errors.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/Errors.php new file mode 100644 index 000000000..56b9086c8 --- /dev/null +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/Errors.php @@ -0,0 +1,95 @@ + false, + 'isError' => true, + ]; + + protected const EXPRESSIONS = [ + Wizard::NOT_ERRORS => 'NOT(ISERROR(%s))', + Wizard::ERRORS => 'ISERROR(%s)', + ]; + + /** + * @var bool + */ + protected $inverse; + + public function __construct(string $cellRange, bool $inverse = false) + { + parent::__construct($cellRange); + $this->inverse = $inverse; + } + + protected function inverse(bool $inverse): void + { + $this->inverse = $inverse; + } + + protected function getExpression(): void + { + $this->expression = sprintf( + self::EXPRESSIONS[$this->inverse ? Wizard::ERRORS : Wizard::NOT_ERRORS], + $this->referenceCell + ); + } + + public function getConditional(): Conditional + { + $this->getExpression(); + + $conditional = new Conditional(); + $conditional->setConditionType( + $this->inverse ? Conditional::CONDITION_CONTAINSERRORS : Conditional::CONDITION_NOTCONTAINSERRORS + ); + $conditional->setConditions([$this->expression]); + $conditional->setStyle($this->getStyle()); + $conditional->setStopIfTrue($this->getStopIfTrue()); + + return $conditional; + } + + public static function fromConditional(Conditional $conditional, string $cellRange = 'A1'): WizardInterface + { + if ( + $conditional->getConditionType() !== Conditional::CONDITION_CONTAINSERRORS && + $conditional->getConditionType() !== Conditional::CONDITION_NOTCONTAINSERRORS + ) { + throw new Exception('Conditional is not an Errors CF Rule conditional'); + } + + $wizard = new self($cellRange); + $wizard->style = $conditional->getStyle(); + $wizard->stopIfTrue = $conditional->getStopIfTrue(); + $wizard->inverse = $conditional->getConditionType() === Conditional::CONDITION_CONTAINSERRORS; + + return $wizard; + } + + /** + * @param string $methodName + * @param mixed[] $arguments + */ + public function __call($methodName, $arguments): self + { + if (!array_key_exists($methodName, self::OPERATORS)) { + throw new Exception('Invalid Operation for Errors CF Rule Wizard'); + } + + $this->inverse(self::OPERATORS[$methodName]); + + return $this; + } +} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/Expression.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/Expression.php new file mode 100644 index 000000000..8c8c7f276 --- /dev/null +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/Expression.php @@ -0,0 +1,73 @@ +validateOperand($expression, Wizard::VALUE_TYPE_FORMULA); + $this->expression = $expression; + + return $this; + } + + public function getConditional(): Conditional + { + $expression = $this->adjustConditionsForCellReferences([$this->expression]); + + $conditional = new Conditional(); + $conditional->setConditionType(Conditional::CONDITION_EXPRESSION); + $conditional->setConditions($expression); + $conditional->setStyle($this->getStyle()); + $conditional->setStopIfTrue($this->getStopIfTrue()); + + return $conditional; + } + + public static function fromConditional(Conditional $conditional, string $cellRange = 'A1'): WizardInterface + { + if ($conditional->getConditionType() !== Conditional::CONDITION_EXPRESSION) { + throw new Exception('Conditional is not an Expression CF Rule conditional'); + } + + $wizard = new self($cellRange); + $wizard->style = $conditional->getStyle(); + $wizard->stopIfTrue = $conditional->getStopIfTrue(); + $wizard->expression = self::reverseAdjustCellRef($conditional->getConditions()[0], $cellRange); + + return $wizard; + } + + /** + * @param string $methodName + * @param mixed[] $arguments + */ + public function __call($methodName, $arguments): self + { + if ($methodName !== 'formula') { + throw new Exception('Invalid Operation for Expression CF Rule Wizard'); + } + + $this->expression(...$arguments); + + return $this; + } +} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/TextValue.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/TextValue.php new file mode 100644 index 000000000..4fa635bec --- /dev/null +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/TextValue.php @@ -0,0 +1,163 @@ + Conditional::OPERATOR_CONTAINSTEXT, + 'doesntContain' => Conditional::OPERATOR_NOTCONTAINS, + 'doesNotContain' => Conditional::OPERATOR_NOTCONTAINS, + 'beginsWith' => Conditional::OPERATOR_BEGINSWITH, + 'startsWith' => Conditional::OPERATOR_BEGINSWITH, + 'endsWith' => Conditional::OPERATOR_ENDSWITH, + ]; + + protected const OPERATORS = [ + Conditional::OPERATOR_CONTAINSTEXT => Conditional::CONDITION_CONTAINSTEXT, + Conditional::OPERATOR_NOTCONTAINS => Conditional::CONDITION_NOTCONTAINSTEXT, + Conditional::OPERATOR_BEGINSWITH => Conditional::CONDITION_BEGINSWITH, + Conditional::OPERATOR_ENDSWITH => Conditional::CONDITION_ENDSWITH, + ]; + + protected const EXPRESSIONS = [ + Conditional::OPERATOR_CONTAINSTEXT => 'NOT(ISERROR(SEARCH(%s,%s)))', + Conditional::OPERATOR_NOTCONTAINS => 'ISERROR(SEARCH(%s,%s))', + Conditional::OPERATOR_BEGINSWITH => 'LEFT(%s,LEN(%s))=%s', + Conditional::OPERATOR_ENDSWITH => 'RIGHT(%s,LEN(%s))=%s', + ]; + + /** @var string */ + protected $operator; + + /** @var string */ + protected $operand; + + /** + * @var string + */ + protected $operandValueType; + + public function __construct(string $cellRange) + { + parent::__construct($cellRange); + } + + protected function operator(string $operator): void + { + if (!isset(self::OPERATORS[$operator])) { + throw new Exception('Invalid Operator for Text Value CF Rule Wizard'); + } + + $this->operator = $operator; + } + + protected function operand(string $operand, string $operandValueType = Wizard::VALUE_TYPE_LITERAL): void + { + if (is_string($operand)) { + $operand = $this->validateOperand($operand, $operandValueType); + } + + $this->operand = $operand; + $this->operandValueType = $operandValueType; + } + + protected function wrapValue(string $value): string + { + return '"' . $value . '"'; + } + + protected function setExpression(): void + { + $operand = $this->operandValueType === Wizard::VALUE_TYPE_LITERAL + ? $this->wrapValue(str_replace('"', '""', $this->operand)) + : $this->cellConditionCheck($this->operand); + + if ( + $this->operator === Conditional::OPERATOR_CONTAINSTEXT || + $this->operator === Conditional::OPERATOR_NOTCONTAINS + ) { + $this->expression = sprintf(self::EXPRESSIONS[$this->operator], $operand, $this->referenceCell); + } else { + $this->expression = sprintf(self::EXPRESSIONS[$this->operator], $this->referenceCell, $operand, $operand); + } + } + + public function getConditional(): Conditional + { + $this->setExpression(); + + $conditional = new Conditional(); + $conditional->setConditionType(self::OPERATORS[$this->operator]); + $conditional->setOperatorType($this->operator); + $conditional->setText( + $this->operandValueType !== Wizard::VALUE_TYPE_LITERAL + ? $this->cellConditionCheck($this->operand) + : $this->operand + ); + $conditional->setConditions([$this->expression]); + $conditional->setStyle($this->getStyle()); + $conditional->setStopIfTrue($this->getStopIfTrue()); + + return $conditional; + } + + public static function fromConditional(Conditional $conditional, string $cellRange = 'A1'): WizardInterface + { + if (!in_array($conditional->getConditionType(), self::OPERATORS, true)) { + throw new Exception('Conditional is not a Text Value CF Rule conditional'); + } + + $wizard = new self($cellRange); + $wizard->operator = (string) array_search($conditional->getConditionType(), self::OPERATORS, true); + $wizard->style = $conditional->getStyle(); + $wizard->stopIfTrue = $conditional->getStopIfTrue(); + + // Best-guess to try and identify if the text is a string literal, a cell reference or a formula? + $wizard->operandValueType = Wizard::VALUE_TYPE_LITERAL; + $condition = $conditional->getText(); + if (is_string($condition) && array_key_exists($condition, Calculation::$excelConstants)) { + $condition = Calculation::$excelConstants[$condition]; + } elseif (preg_match('/^' . Calculation::CALCULATION_REGEXP_CELLREF_RELATIVE . '$/i', $condition)) { + $wizard->operandValueType = Wizard::VALUE_TYPE_CELL; + $condition = self::reverseAdjustCellRef($condition, $cellRange); + } elseif ( + preg_match('/\(\)/', $condition) || + preg_match('/' . Calculation::CALCULATION_REGEXP_CELLREF_RELATIVE . '/i', $condition) + ) { + $wizard->operandValueType = Wizard::VALUE_TYPE_FORMULA; + } + $wizard->operand = $condition; + + return $wizard; + } + + /** + * @param string $methodName + * @param mixed[] $arguments + */ + public function __call($methodName, $arguments): self + { + if (!isset(self::MAGIC_OPERATIONS[$methodName])) { + throw new Exception('Invalid Operation for Text Value CF Rule Wizard'); + } + + $this->operator(self::MAGIC_OPERATIONS[$methodName]); + $this->operand(...$arguments); + + return $this; + } +} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/WizardAbstract.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/WizardAbstract.php new file mode 100644 index 000000000..75d6856e2 --- /dev/null +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/WizardAbstract.php @@ -0,0 +1,197 @@ +setCellRange($cellRange); + } + + public function getCellRange(): string + { + return $this->cellRange; + } + + public function setCellRange(string $cellRange): void + { + $this->cellRange = $cellRange; + $this->setReferenceCellForExpressions($cellRange); + } + + protected function setReferenceCellForExpressions(string $conditionalRange): void + { + $conditionalRange = Coordinate::splitRange(str_replace('$', '', strtoupper($conditionalRange))); + [$this->referenceCell] = $conditionalRange[0]; + + [$this->referenceColumn, $this->referenceRow] = Coordinate::indexesFromString($this->referenceCell); + } + + public function getStopIfTrue(): bool + { + return $this->stopIfTrue; + } + + public function setStopIfTrue(bool $stopIfTrue): void + { + $this->stopIfTrue = $stopIfTrue; + } + + public function getStyle(): Style + { + return $this->style ?? new Style(false, true); + } + + public function setStyle(Style $style): void + { + $this->style = $style; + } + + protected function validateOperand(string $operand, string $operandValueType = Wizard::VALUE_TYPE_LITERAL): string + { + if ( + $operandValueType === Wizard::VALUE_TYPE_LITERAL && + substr($operand, 0, 1) === '"' && + substr($operand, -1) === '"' + ) { + $operand = str_replace('""', '"', substr($operand, 1, -1)); + } elseif ($operandValueType === Wizard::VALUE_TYPE_FORMULA && substr($operand, 0, 1) === '=') { + $operand = substr($operand, 1); + } + + return $operand; + } + + protected static function reverseCellAdjustment(array $matches, int $referenceColumn, int $referenceRow): string + { + $worksheet = $matches[1]; + $column = $matches[6]; + $row = $matches[7]; + + if (strpos($column, '$') === false) { + $column = Coordinate::columnIndexFromString($column); + $column -= $referenceColumn - 1; + $column = Coordinate::stringFromColumnIndex($column); + } + + if (strpos($row, '$') === false) { + $row -= $referenceRow - 1; + } + + return "{$worksheet}{$column}{$row}"; + } + + protected static function reverseAdjustCellRef(string $condition, string $cellRange): string + { + $conditionalRange = Coordinate::splitRange(str_replace('$', '', strtoupper($cellRange))); + [$referenceCell] = $conditionalRange[0]; + [$referenceColumnIndex, $referenceRow] = Coordinate::indexesFromString($referenceCell); + + $splitCondition = explode(Calculation::FORMULA_STRING_QUOTE, $condition); + $i = false; + foreach ($splitCondition as &$value) { + // Only count/replace in alternating array entries (ie. not in quoted strings) + if ($i = !$i) { + $value = preg_replace_callback( + '/' . Calculation::CALCULATION_REGEXP_CELLREF_RELATIVE . '/i', + function ($matches) use ($referenceColumnIndex, $referenceRow) { + return self::reverseCellAdjustment($matches, $referenceColumnIndex, $referenceRow); + }, + $value + ); + } + } + unset($value); + + // Then rebuild the condition string to return it + return implode(Calculation::FORMULA_STRING_QUOTE, $splitCondition); + } + + protected function conditionCellAdjustment(array $matches): string + { + $worksheet = $matches[1]; + $column = $matches[6]; + $row = $matches[7]; + + if (strpos($column, '$') === false) { + $column = Coordinate::columnIndexFromString($column); + $column += $this->referenceColumn - 1; + $column = Coordinate::stringFromColumnIndex($column); + } + + if (strpos($row, '$') === false) { + $row += $this->referenceRow - 1; + } + + return "{$worksheet}{$column}{$row}"; + } + + protected function cellConditionCheck(string $condition): string + { + $splitCondition = explode(Calculation::FORMULA_STRING_QUOTE, $condition); + $i = false; + foreach ($splitCondition as &$value) { + // Only count/replace in alternating array entries (ie. not in quoted strings) + if ($i = !$i) { + $value = preg_replace_callback( + '/' . Calculation::CALCULATION_REGEXP_CELLREF_RELATIVE . '/i', + [$this, 'conditionCellAdjustment'], + $value + ); + } + } + unset($value); + + // Then rebuild the condition string to return it + return implode(Calculation::FORMULA_STRING_QUOTE, $splitCondition); + } + + protected function adjustConditionsForCellReferences(array $conditions): array + { + return array_map( + [$this, 'cellConditionCheck'], + $conditions + ); + } +} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/WizardInterface.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/WizardInterface.php new file mode 100644 index 000000000..10ad57b20 --- /dev/null +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/WizardInterface.php @@ -0,0 +1,25 @@ +-] // language info is in hexadecimal // strip off chinese part like [DBNum1][$-804] - $format = preg_replace('/^(\[DBNum\d\])*(\[\$[^\]]*\])/i', '', $format); + $format = preg_replace('/^(\[DBNum\d\])*(\[\$[^\]]*\])/i', '', $format) ?? ''; // OpenOffice.org uses upper-case number formats, e.g. 'YYYY', convert to lower-case; // but we don't want to change any quoted strings - $format = preg_replace_callback('/(?:^|")([^"]*)(?:$|")/', ['self', 'setLowercaseCallback'], $format); + /** @var callable */ + $callable = ['self', 'setLowercaseCallback']; + $format = preg_replace_callback('/(?:^|")([^"]*)(?:$|")/', $callable, $format); // Only process the non-quoted blocks for date format characters $blocks = explode('"', $format); @@ -106,7 +108,9 @@ class DateFormatter $format = implode('"', $blocks); // escape any quoted characters so that DateTime format() will render them correctly - $format = preg_replace_callback('/"(.*)"/U', ['self', 'escapeQuotesCallback'], $format); + /** @var callable */ + $callback = ['self', 'escapeQuotesCallback']; + $format = preg_replace_callback('/"(.*)"/U', $callback, $format); $dateObj = Date::excelToDateTimeObject($value); // If the colon preceding minute had been quoted, as happens in diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/NumberFormat/PercentageFormatter.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/NumberFormat/PercentageFormatter.php index cf1731ec8..334c40df6 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/NumberFormat/PercentageFormatter.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/NumberFormat/PercentageFormatter.php @@ -37,6 +37,9 @@ class PercentageFormatter extends BaseFormatter $replacement = "{$wholePartSize}.{$decimalPartSize}"; $mask = preg_replace('/[#0,]+\.?[?#0,]*/ui', "%{$replacement}f{$placeHolders}", $format); - return sprintf($mask, $value); + /** @var float */ + $valueFloat = $value; + + return sprintf($mask, round($valueFloat, $decimalPartSize)); } } diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Style.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Style.php index fdb15451b..78e5ebbff 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Style.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Style.php @@ -78,9 +78,7 @@ class Style extends Supervisor * @see Style::applyFromArray() * @see Style::getHashCode() * - * @phpstan-var null|array{styleByHash: array, hashByObjId: array} - * - * @var array + * @var ?array */ private static $cachedStyles; diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/ColumnDimension.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/ColumnDimension.php index 8a48f470c..17dd261b3 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/ColumnDimension.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/ColumnDimension.php @@ -2,6 +2,7 @@ namespace PhpOffice\PhpSpreadsheet\Worksheet; +use PhpOffice\PhpSpreadsheet\Cell\Coordinate; use PhpOffice\PhpSpreadsheet\Helper\Dimension as CssDimension; class ColumnDimension extends Dimension @@ -53,16 +54,32 @@ class ColumnDimension extends Dimension /** * Set column index as string eg: 'A'. - * - * @return $this */ - public function setColumnIndex(string $index) + public function setColumnIndex(string $index): self { $this->columnIndex = $index; return $this; } + /** + * Get column index as numeric. + */ + public function getColumnNumeric(): int + { + return Coordinate::columnIndexFromString($this->columnIndex); + } + + /** + * Set column index as numeric. + */ + public function setColumnNumeric(int $index): self + { + $this->columnIndex = Coordinate::stringFromColumnIndex($index); + + return $this; + } + /** * Get Width. * diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Dimension.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Dimension.php index 894ac19ed..ba03b5b72 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Dimension.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Dimension.php @@ -131,19 +131,4 @@ abstract class Dimension return $this; } - - /** - * Implement PHP __clone to create a deep clone, not just a shallow copy. - */ - public function __clone() - { - $vars = get_object_vars($this); - foreach ($vars as $key => $value) { - if (is_object($value)) { - $this->$key = clone $value; - } else { - $this->$key = $value; - } - } - } } diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Worksheet.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Worksheet.php index ca8c3dfe4..362f20f08 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Worksheet.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Worksheet.php @@ -1291,7 +1291,7 @@ class Worksheet implements IComparable * * @return Cell Cell that was created */ - private function createNewCell($coordinate) + public function createNewCell($coordinate) { $cell = new Cell(null, DataType::TYPE_NULL, $this); $this->cellCollection->add($coordinate, $cell); @@ -1415,10 +1415,8 @@ class Worksheet implements IComparable * Get style for cell. * * @param string $cellCoordinate Cell coordinate (or range) to get style for, eg: 'A1' - * - * @return Style */ - public function getStyle($cellCoordinate) + public function getStyle($cellCoordinate): Style { // set this sheet as active $this->parent->setActiveSheetIndex($this->parent->getIndex($this)); @@ -1440,7 +1438,7 @@ class Worksheet implements IComparable * * @return Conditional[] */ - public function getConditionalStyles($coordinate) + public function getConditionalStyles(string $coordinate): array { $coordinate = strtoupper($coordinate); if (strpos($coordinate, ':') !== false) { @@ -1457,6 +1455,19 @@ class Worksheet implements IComparable return []; } + public function getConditionalRange(string $coordinate): ?string + { + $coordinate = strtoupper($coordinate); + $cell = $this->getCell($coordinate); + foreach (array_keys($this->conditionalStylesCollection) as $conditionalRange) { + if ($cell->isInRange($conditionalRange)) { + return $conditionalRange; + } + } + + return null; + } + /** * Do conditional styles exist for this cell? * @@ -1465,10 +1476,8 @@ class Worksheet implements IComparable * conditional style range. * If a range of cells is specified, then true will only be returned if the range matches the entire * range of the conditional. - * - * @return bool */ - public function conditionalStylesExists($coordinate) + public function conditionalStylesExists($coordinate): bool { $coordinate = strtoupper($coordinate); if (strpos($coordinate, ':') !== false) { @@ -1689,27 +1698,33 @@ class Worksheet implements IComparable { // Uppercase coordinate $range = strtoupper($range); + // Convert 'A:C' to 'A1:C1048576' + $range = self::pregReplace('/^([A-Z]+):([A-Z]+)$/', '${1}1:${2}1048576', $range); + // Convert '1:3' to 'A1:XFD3' + $range = self::pregReplace('/^(\\d+):(\\d+)$/', 'A${1}:XFD${2}', $range); - if (strpos($range, ':') !== false) { + if (preg_match('/^([A-Z]+)(\\d+):([A-Z]+)(\\d+)$/', $range, $matches) === 1) { $this->mergeCells[$range] = $range; - - // make sure cells are created - - // get the cells in the range - $aReferences = Coordinate::extractAllCellReferencesInRange($range); + $firstRow = (int) $matches[2]; + $lastRow = (int) $matches[4]; + $firstColumn = $matches[1]; + $lastColumn = $matches[3]; + $firstColumnIndex = Coordinate::columnIndexFromString($firstColumn); + $lastColumnIndex = Coordinate::columnIndexFromString($lastColumn); + $numberRows = $lastRow - $firstRow; + $numberColumns = $lastColumnIndex - $firstColumnIndex; // create upper left cell if it does not already exist - $upperLeft = $aReferences[0]; + $upperLeft = "$firstColumn$firstRow"; if (!$this->cellExists($upperLeft)) { $this->getCell($upperLeft)->setValueExplicit(null, DataType::TYPE_NULL); } // Blank out the rest of the cells in the range (if they exist) - $count = count($aReferences); - for ($i = 1; $i < $count; ++$i) { - if ($this->cellExists($aReferences[$i])) { - $this->getCell($aReferences[$i])->setValueExplicit(null, DataType::TYPE_NULL); - } + if ($numberRows > $numberColumns) { + $this->clearMergeCellsByColumn($firstColumn, $lastColumn, $firstRow, $lastRow, $upperLeft); + } else { + $this->clearMergeCellsByRow($firstColumn, $lastColumnIndex, $firstRow, $lastRow, $upperLeft); } } else { throw new Exception('Merge must be set on a range of cells.'); @@ -1718,6 +1733,47 @@ class Worksheet implements IComparable return $this; } + private function clearMergeCellsByColumn(string $firstColumn, string $lastColumn, int $firstRow, int $lastRow, string $upperLeft): void + { + foreach ($this->getColumnIterator($firstColumn, $lastColumn) as $column) { + $iterator = $column->getCellIterator($firstRow); + $iterator->setIterateOnlyExistingCells(true); + foreach ($iterator as $cell) { + if ($cell !== null) { + $row = $cell->getRow(); + if ($row > $lastRow) { + break; + } + $thisCell = $cell->getColumn() . $row; + if ($upperLeft !== $thisCell) { + $cell->setValueExplicit(null, DataType::TYPE_NULL); + } + } + } + } + } + + private function clearMergeCellsByRow(string $firstColumn, int $lastColumnIndex, int $firstRow, int $lastRow, string $upperLeft): void + { + foreach ($this->getRowIterator($firstRow, $lastRow) as $row) { + $iterator = $row->getCellIterator($firstColumn); + $iterator->setIterateOnlyExistingCells(true); + foreach ($iterator as $cell) { + if ($cell !== null) { + $column = $cell->getColumn(); + $columnIndex = Coordinate::columnIndexFromString($column); + if ($columnIndex > $lastColumnIndex) { + break; + } + $thisCell = $column . $cell->getRow(); + if ($upperLeft !== $thisCell) { + $cell->setValueExplicit(null, DataType::TYPE_NULL); + } + } + } + } + } + /** * Set merge on a cell range by using numeric cell coordinates. * @@ -2101,6 +2157,7 @@ class Worksheet implements IComparable throw new Exception('Rows to be deleted should at least start from row 1.'); } + $holdRowDimensions = $this->removeRowDimensions($row, $numberOfRows); $highestRow = $this->getHighestDataRow(); $removedRowsCounter = 0; @@ -2118,9 +2175,30 @@ class Worksheet implements IComparable --$highestRow; } + $this->rowDimensions = $holdRowDimensions; + return $this; } + private function removeRowDimensions(int $row, int $numberOfRows): array + { + $highRow = $row + $numberOfRows - 1; + $holdRowDimensions = []; + foreach ($this->rowDimensions as $rowDimension) { + $num = $rowDimension->getRowIndex(); + if ($num < $row) { + $holdRowDimensions[$num] = $rowDimension; + } elseif ($num > $highRow) { + $num -= $numberOfRows; + $cloneDimension = clone $rowDimension; + $cloneDimension->setRowIndex($num); + $holdRowDimensions[$num] = $cloneDimension; + } + } + + return $holdRowDimensions; + } + /** * Remove a column, updating all possible related data. * @@ -2143,6 +2221,8 @@ class Worksheet implements IComparable return $this; } + $holdColumnDimensions = $this->removeColumnDimensions($pColumnIndex, $numberOfColumns); + $column = Coordinate::stringFromColumnIndex($pColumnIndex + $numberOfColumns); $objReferenceHelper = ReferenceHelper::getInstance(); $objReferenceHelper->insertNewBefore($column . '1', -$numberOfColumns, 0, $this); @@ -2154,11 +2234,33 @@ class Worksheet implements IComparable $highestColumn = Coordinate::stringFromColumnIndex(Coordinate::columnIndexFromString($highestColumn) - 1); } + $this->columnDimensions = $holdColumnDimensions; + $this->garbageCollect(); return $this; } + private function removeColumnDimensions(int $pColumnIndex, int $numberOfColumns): array + { + $highCol = $pColumnIndex + $numberOfColumns - 1; + $holdColumnDimensions = []; + foreach ($this->columnDimensions as $columnDimension) { + $num = $columnDimension->getColumnNumeric(); + if ($num < $pColumnIndex) { + $str = $columnDimension->getColumnIndex(); + $holdColumnDimensions[$str] = $columnDimension; + } elseif ($num > $highCol) { + $cloneDimension = clone $columnDimension; + $cloneDimension->setColumnNumeric($num - $numberOfColumns); + $str = $cloneDimension->getColumnIndex(); + $holdColumnDimensions[$str] = $cloneDimension; + } + } + + return $holdColumnDimensions; + } + /** * Remove a column, updating all possible related data. * diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/Worksheet.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/Worksheet.php index 2387ceb06..979d3cb74 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/Worksheet.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/Worksheet.php @@ -433,6 +433,7 @@ class Worksheet extends BIFFwriter } else { switch ($cell->getDatatype()) { case DataType::TYPE_STRING: + case DataType::TYPE_INLINE: case DataType::TYPE_NULL: if ($cVal === '' || $cVal === null) { $this->writeBlank($row, $column, $xfIndex); diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php index 494dc70ac..ab390a904 100644 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php +++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php @@ -205,10 +205,10 @@ class Worksheet extends WriterPart // Zoom scales if ($worksheet->getSheetView()->getZoomScale() != 100) { - $objWriter->writeAttribute('zoomScale', $worksheet->getSheetView()->getZoomScale()); + $objWriter->writeAttribute('zoomScale', (string) $worksheet->getSheetView()->getZoomScale()); } if ($worksheet->getSheetView()->getZoomScaleNormal() != 100) { - $objWriter->writeAttribute('zoomScaleNormal', $worksheet->getSheetView()->getZoomScaleNormal()); + $objWriter->writeAttribute('zoomScaleNormal', (string) $worksheet->getSheetView()->getZoomScaleNormal()); } // Show zeros (Excel also writes this attribute only if set to false) @@ -468,21 +468,63 @@ class Worksheet extends WriterPart private static function writeOtherCondElements(XMLWriter $objWriter, Conditional $conditional, string $cellCoordinate): void { + $conditions = $conditional->getConditions(); if ( $conditional->getConditionType() == Conditional::CONDITION_CELLIS - || $conditional->getConditionType() == Conditional::CONDITION_CONTAINSTEXT || $conditional->getConditionType() == Conditional::CONDITION_EXPRESSION + || !empty($conditions) ) { - foreach ($conditional->getConditions() as $formula) { + foreach ($conditions as $formula) { // Formula $objWriter->writeElement('formula', Xlfn::addXlfn($formula)); } - } elseif ($conditional->getConditionType() == Conditional::CONDITION_CONTAINSBLANKS) { - // formula copied from ms xlsx xml source file - $objWriter->writeElement('formula', 'LEN(TRIM(' . $cellCoordinate . '))=0'); - } elseif ($conditional->getConditionType() == Conditional::CONDITION_NOTCONTAINSBLANKS) { - // formula copied from ms xlsx xml source file - $objWriter->writeElement('formula', 'LEN(TRIM(' . $cellCoordinate . '))>0'); + } else { + if ($conditional->getConditionType() == Conditional::CONDITION_CONTAINSBLANKS) { + // formula copied from ms xlsx xml source file + $objWriter->writeElement('formula', 'LEN(TRIM(' . $cellCoordinate . '))=0'); + } elseif ($conditional->getConditionType() == Conditional::CONDITION_NOTCONTAINSBLANKS) { + // formula copied from ms xlsx xml source file + $objWriter->writeElement('formula', 'LEN(TRIM(' . $cellCoordinate . '))>0'); + } elseif ($conditional->getConditionType() == Conditional::CONDITION_CONTAINSERRORS) { + // formula copied from ms xlsx xml source file + $objWriter->writeElement('formula', 'ISERROR(' . $cellCoordinate . ')'); + } elseif ($conditional->getConditionType() == Conditional::CONDITION_NOTCONTAINSERRORS) { + // formula copied from ms xlsx xml source file + $objWriter->writeElement('formula', 'NOT(ISERROR(' . $cellCoordinate . '))'); + } + } + } + + private static function writeTimePeriodCondElements(XMLWriter $objWriter, Conditional $conditional, string $cellCoordinate): void + { + $txt = $conditional->getText(); + if ($txt !== null) { + $objWriter->writeAttribute('timePeriod', $txt); + if (empty($conditional->getConditions())) { + if ($conditional->getOperatorType() == Conditional::TIMEPERIOD_TODAY) { + $objWriter->writeElement('formula', 'FLOOR(' . $cellCoordinate . ')=TODAY()'); + } elseif ($conditional->getOperatorType() == Conditional::TIMEPERIOD_TOMORROW) { + $objWriter->writeElement('formula', 'FLOOR(' . $cellCoordinate . ')=TODAY()+1'); + } elseif ($conditional->getOperatorType() == Conditional::TIMEPERIOD_YESTERDAY) { + $objWriter->writeElement('formula', 'FLOOR(' . $cellCoordinate . ')=TODAY()-1'); + } elseif ($conditional->getOperatorType() == Conditional::TIMEPERIOD_LAST_7_DAYS) { + $objWriter->writeElement('formula', 'AND(TODAY()-FLOOR(' . $cellCoordinate . ',1)<=6,FLOOR(' . $cellCoordinate . ',1)<=TODAY())'); + } elseif ($conditional->getOperatorType() == Conditional::TIMEPERIOD_LAST_WEEK) { + $objWriter->writeElement('formula', 'AND(TODAY()-ROUNDDOWN(' . $cellCoordinate . ',0)>=(WEEKDAY(TODAY())),TODAY()-ROUNDDOWN(' . $cellCoordinate . ',0)<(WEEKDAY(TODAY())+7))'); + } elseif ($conditional->getOperatorType() == Conditional::TIMEPERIOD_THIS_WEEK) { + $objWriter->writeElement('formula', 'AND(TODAY()-ROUNDDOWN(' . $cellCoordinate . ',0)<=WEEKDAY(TODAY())-1,ROUNDDOWN(' . $cellCoordinate . ',0)-TODAY()<=7-WEEKDAY(TODAY()))'); + } elseif ($conditional->getOperatorType() == Conditional::TIMEPERIOD_NEXT_WEEK) { + $objWriter->writeElement('formula', 'AND(ROUNDDOWN(' . $cellCoordinate . ',0)-TODAY()>(7-WEEKDAY(TODAY())),ROUNDDOWN(' . $cellCoordinate . ',0)-TODAY()<(15-WEEKDAY(TODAY())))'); + } elseif ($conditional->getOperatorType() == Conditional::TIMEPERIOD_LAST_MONTH) { + $objWriter->writeElement('formula', 'AND(MONTH(' . $cellCoordinate . ')=MONTH(EDATE(TODAY(),0-1)),YEAR(' . $cellCoordinate . ')=YEAR(EDATE(TODAY(),0-1)))'); + } elseif ($conditional->getOperatorType() == Conditional::TIMEPERIOD_THIS_MONTH) { + $objWriter->writeElement('formula', 'AND(MONTH(' . $cellCoordinate . ')=MONTH(TODAY()),YEAR(' . $cellCoordinate . ')=YEAR(TODAY()))'); + } elseif ($conditional->getOperatorType() == Conditional::TIMEPERIOD_NEXT_MONTH) { + $objWriter->writeElement('formula', 'AND(MONTH(' . $cellCoordinate . ')=MONTH(EDATE(TODAY(),0+1)),YEAR(' . $cellCoordinate . ')=YEAR(EDATE(TODAY(),0+1)))'); + } + } else { + $objWriter->writeElement('formula', $conditional->getConditions()[0]); + } } } @@ -491,14 +533,18 @@ class Worksheet extends WriterPart $txt = $conditional->getText(); if ($txt !== null) { $objWriter->writeAttribute('text', $txt); - if ($conditional->getOperatorType() == Conditional::OPERATOR_CONTAINSTEXT) { - $objWriter->writeElement('formula', 'NOT(ISERROR(SEARCH("' . $txt . '",' . $cellCoordinate . ')))'); - } elseif ($conditional->getOperatorType() == Conditional::OPERATOR_BEGINSWITH) { - $objWriter->writeElement('formula', 'LEFT(' . $cellCoordinate . ',' . strlen($txt) . ')="' . $txt . '"'); - } elseif ($conditional->getOperatorType() == Conditional::OPERATOR_ENDSWITH) { - $objWriter->writeElement('formula', 'RIGHT(' . $cellCoordinate . ',' . strlen($txt) . ')="' . $txt . '"'); - } elseif ($conditional->getOperatorType() == Conditional::OPERATOR_NOTCONTAINS) { - $objWriter->writeElement('formula', 'ISERROR(SEARCH("' . $txt . '",' . $cellCoordinate . '))'); + if (empty($conditional->getConditions())) { + if ($conditional->getOperatorType() == Conditional::OPERATOR_CONTAINSTEXT) { + $objWriter->writeElement('formula', 'NOT(ISERROR(SEARCH("' . $txt . '",' . $cellCoordinate . ')))'); + } elseif ($conditional->getOperatorType() == Conditional::OPERATOR_BEGINSWITH) { + $objWriter->writeElement('formula', 'LEFT(' . $cellCoordinate . ',LEN("' . $txt . '"))="' . $txt . '"'); + } elseif ($conditional->getOperatorType() == Conditional::OPERATOR_ENDSWITH) { + $objWriter->writeElement('formula', 'RIGHT(' . $cellCoordinate . ',LEN("' . $txt . '"))="' . $txt . '"'); + } elseif ($conditional->getOperatorType() == Conditional::OPERATOR_NOTCONTAINS) { + $objWriter->writeElement('formula', 'ISERROR(SEARCH("' . $txt . '",' . $cellCoordinate . '))'); + } + } else { + $objWriter->writeElement('formula', $conditional->getConditions()[0]); } } } @@ -601,57 +647,63 @@ class Worksheet extends WriterPart // Loop through styles in the current worksheet foreach ($worksheet->getConditionalStylesCollection() as $cellCoordinate => $conditionalStyles) { + $objWriter->startElement('conditionalFormatting'); + $objWriter->writeAttribute('sqref', $cellCoordinate); + foreach ($conditionalStyles as $conditional) { // WHY was this again? // if ($this->getParentWriter()->getStylesConditionalHashTable()->getIndexForHashCode($conditional->getHashCode()) == '') { // continue; // } - if ($conditional->getConditionType() != Conditional::CONDITION_NONE) { - // conditionalFormatting - $objWriter->startElement('conditionalFormatting'); - $objWriter->writeAttribute('sqref', $cellCoordinate); + // cfRule + $objWriter->startElement('cfRule'); + $objWriter->writeAttribute('type', $conditional->getConditionType()); + self::writeAttributeIf( + $objWriter, + ($conditional->getConditionType() != Conditional::CONDITION_DATABAR), + 'dxfId', + (string) $this->getParentWriter()->getStylesConditionalHashTable()->getIndexForHashCode($conditional->getHashCode()) + ); + $objWriter->writeAttribute('priority', $id++); - // cfRule - $objWriter->startElement('cfRule'); - $objWriter->writeAttribute('type', $conditional->getConditionType()); - self::writeAttributeIf( - $objWriter, - ($conditional->getConditionType() != Conditional::CONDITION_DATABAR), - 'dxfId', - (string) $this->getParentWriter()->getStylesConditionalHashTable()->getIndexForHashCode($conditional->getHashCode()) - ); - $objWriter->writeAttribute('priority', $id++); - - self::writeAttributeif( - $objWriter, - ( - $conditional->getConditionType() === Conditional::CONDITION_CELLIS - || $conditional->getConditionType() === Conditional::CONDITION_CONTAINSTEXT - || $conditional->getConditionType() === Conditional::CONDITION_NOTCONTAINSTEXT - ) && $conditional->getOperatorType() !== Conditional::OPERATOR_NONE, - 'operator', - $conditional->getOperatorType() - ); - - self::writeAttributeIf($objWriter, $conditional->getStopIfTrue(), 'stopIfTrue', '1'); - - if ( - $conditional->getConditionType() === Conditional::CONDITION_CONTAINSTEXT + self::writeAttributeif( + $objWriter, + ( + $conditional->getConditionType() === Conditional::CONDITION_CELLIS + || $conditional->getConditionType() === Conditional::CONDITION_CONTAINSTEXT || $conditional->getConditionType() === Conditional::CONDITION_NOTCONTAINSTEXT - ) { - self::writeTextCondElements($objWriter, $conditional, $cellCoordinate); - } else { - self::writeOtherCondElements($objWriter, $conditional, $cellCoordinate); - } + || $conditional->getConditionType() === Conditional::CONDITION_BEGINSWITH + || $conditional->getConditionType() === Conditional::CONDITION_ENDSWITH + ) && $conditional->getOperatorType() !== Conditional::OPERATOR_NONE, + 'operator', + $conditional->getOperatorType() + ); - // - self::writeDataBarElements($objWriter, $conditional->getDataBar()); + self::writeAttributeIf($objWriter, $conditional->getStopIfTrue(), 'stopIfTrue', '1'); - $objWriter->endElement(); //end cfRule + $cellRange = Coordinate::splitRange(str_replace('$', '', strtoupper($cellCoordinate))); + [$topLeftCell] = $cellRange[0]; - $objWriter->endElement(); + if ( + $conditional->getConditionType() === Conditional::CONDITION_CONTAINSTEXT + || $conditional->getConditionType() === Conditional::CONDITION_NOTCONTAINSTEXT + || $conditional->getConditionType() === Conditional::CONDITION_BEGINSWITH + || $conditional->getConditionType() === Conditional::CONDITION_ENDSWITH + ) { + self::writeTextCondElements($objWriter, $conditional, $topLeftCell); + } elseif ($conditional->getConditionType() === Conditional::CONDITION_TIMEPERIOD) { + self::writeTimePeriodCondElements($objWriter, $conditional, $topLeftCell); + } else { + self::writeOtherCondElements($objWriter, $conditional, $topLeftCell); } + + // + self::writeDataBarElements($objWriter, $conditional->getDataBar()); + + $objWriter->endElement(); //end cfRule } + + $objWriter->endElement(); //end conditionalFormatting } } @@ -1137,10 +1189,12 @@ class Worksheet extends WriterPart { $objWriter->writeAttribute('t', $mappedType); if (!$cellValue instanceof RichText) { + $objWriter->startElement('is'); $objWriter->writeElement( 't', StringHelper::controlCharacterPHP2OOXML(htmlspecialchars($cellValue, Settings::htmlEntityFlags())) ); + $objWriter->endElement(); } elseif ($cellValue instanceof RichText) { $objWriter->startElement('is'); $this->getParentWriter()->getWriterPartstringtable()->writeRichText($objWriter, $cellValue); diff --git a/vendor/services.php b/vendor/services.php index e6056e741..29c0a5fa3 100644 --- a/vendor/services.php +++ b/vendor/services.php @@ -1,5 +1,5 @@ 'think\\app\\Service', diff --git a/vendor/symfony/polyfill-php80/Php80.php b/vendor/symfony/polyfill-php80/Php80.php index 5fef51184..362dd1a95 100644 --- a/vendor/symfony/polyfill-php80/Php80.php +++ b/vendor/symfony/polyfill-php80/Php80.php @@ -100,6 +100,16 @@ final class Php80 public static function str_ends_with(string $haystack, string $needle): bool { - return '' === $needle || ('' !== $haystack && 0 === substr_compare($haystack, $needle, -\strlen($needle))); + if ('' === $needle || $needle === $haystack) { + return true; + } + + if ('' === $haystack) { + return false; + } + + $needleLength = \strlen($needle); + + return $needleLength <= \strlen($haystack) && 0 === substr_compare($haystack, $needle, -$needleLength); } } diff --git a/vendor/symfony/polyfill-php80/PhpToken.php b/vendor/symfony/polyfill-php80/PhpToken.php new file mode 100644 index 000000000..fe6e69105 --- /dev/null +++ b/vendor/symfony/polyfill-php80/PhpToken.php @@ -0,0 +1,103 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Polyfill\Php80; + +/** + * @author Fedonyuk Anton + * + * @internal + */ +class PhpToken implements \Stringable +{ + /** + * @var int + */ + public $id; + + /** + * @var string + */ + public $text; + + /** + * @var int + */ + public $line; + + /** + * @var int + */ + public $pos; + + public function __construct(int $id, string $text, int $line = -1, int $position = -1) + { + $this->id = $id; + $this->text = $text; + $this->line = $line; + $this->pos = $position; + } + + public function getTokenName(): ?string + { + if ('UNKNOWN' === $name = token_name($this->id)) { + $name = \strlen($this->text) > 1 || \ord($this->text) < 32 ? null : $this->text; + } + + return $name; + } + + /** + * @param int|string|array $kind + */ + public function is($kind): bool + { + foreach ((array) $kind as $value) { + if (\in_array($value, [$this->id, $this->text], true)) { + return true; + } + } + + return false; + } + + public function isIgnorable(): bool + { + return \in_array($this->id, [\T_WHITESPACE, \T_COMMENT, \T_DOC_COMMENT, \T_OPEN_TAG], true); + } + + public function __toString(): string + { + return (string) $this->text; + } + + /** + * @return static[] + */ + public static function tokenize(string $code, int $flags = 0): array + { + $line = 1; + $position = 0; + $tokens = token_get_all($code, $flags); + foreach ($tokens as $index => $token) { + if (\is_string($token)) { + $id = \ord($token); + $text = $token; + } else { + [$id, $text, $line] = $token; + } + $tokens[$index] = new static($id, $text, $line, $position); + $position += \strlen($text); + } + + return $tokens; + } +} diff --git a/vendor/symfony/polyfill-php80/Resources/stubs/PhpToken.php b/vendor/symfony/polyfill-php80/Resources/stubs/PhpToken.php new file mode 100644 index 000000000..72f10812b --- /dev/null +++ b/vendor/symfony/polyfill-php80/Resources/stubs/PhpToken.php @@ -0,0 +1,7 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * @author Nicolas Grekas + * + * @internal + */ +final class MysqliCaster +{ + public static function castMysqliDriver(\mysqli_driver $c, array $a, Stub $stub, bool $isNested): array + { + foreach ($a as $k => $v) { + if (isset($c->$k)) { + $a[$k] = $c->$k; + } + } + + return $a; + } +} diff --git a/vendor/symfony/var-dumper/Cloner/AbstractCloner.php b/vendor/symfony/var-dumper/Cloner/AbstractCloner.php index eeac88295..d2e5039b8 100644 --- a/vendor/symfony/var-dumper/Cloner/AbstractCloner.php +++ b/vendor/symfony/var-dumper/Cloner/AbstractCloner.php @@ -144,6 +144,8 @@ abstract class AbstractCloner implements ClonerInterface 'Ds\Pair' => ['Symfony\Component\VarDumper\Caster\DsCaster', 'castPair'], 'Symfony\Component\VarDumper\Caster\DsPairStub' => ['Symfony\Component\VarDumper\Caster\DsCaster', 'castPairStub'], + 'mysqli_driver' => ['Symfony\Component\VarDumper\Caster\MysqliCaster', 'castMysqliDriver'], + 'CurlHandle' => ['Symfony\Component\VarDumper\Caster\ResourceCaster', 'castCurl'], ':curl' => ['Symfony\Component\VarDumper\Caster\ResourceCaster', 'castCurl'], diff --git a/vendor/symfony/var-dumper/Dumper/HtmlDumper.php b/vendor/symfony/var-dumper/Dumper/HtmlDumper.php index 8409a0c74..88e5ba928 100644 --- a/vendor/symfony/var-dumper/Dumper/HtmlDumper.php +++ b/vendor/symfony/var-dumper/Dumper/HtmlDumper.php @@ -978,7 +978,7 @@ EOHTML } $this->lastDepth = $depth; - $this->line = mb_convert_encoding($this->line, 'HTML-ENTITIES', 'UTF-8'); + $this->line = mb_encode_numericentity($this->line, [0x80, 0xFFFF, 0, 0xFFFF], 'UTF-8'); if (-1 === $depth) { AbstractDumper::dumpLine(0); diff --git a/vendor/symfony/var-dumper/LICENSE b/vendor/symfony/var-dumper/LICENSE index c1f0aac1c..a843ec124 100644 --- a/vendor/symfony/var-dumper/LICENSE +++ b/vendor/symfony/var-dumper/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2014-2021 Fabien Potencier +Copyright (c) 2014-2022 Fabien Potencier Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/vendor/topthink/think-orm/src/db/Raw.php b/vendor/topthink/think-orm/src/db/Raw.php index 833fbf08c..b956ff690 100644 --- a/vendor/topthink/think-orm/src/db/Raw.php +++ b/vendor/topthink/think-orm/src/db/Raw.php @@ -64,8 +64,4 @@ class Raw return $this->bind; } - public function __toString() - { - return (string) $this->value; - } }