nfTlWNl rn Ѻq$³*%yNk9S[0m!6 Ȏ5,_Ng&3 I]C63q,l}^լۅ=  \CcݯȾtoMka<^cSƙ[)7s39嬢nW-NT &;͡H1B!9'ؿb3(NMR,u,Z|3jg:~K cOUÈBGO[a-@`޾ J:*C~o6s&eFߤ?k#x<ڍ'U5L͒W] 4 !WCkHfyk̢!x );w5)x FZK,] UEk V$E@ ς\Fur, "3k 6o5ROҹwT9\e6~w [¹^$Vɖ&I~;lrߞa.+LLQ'[).1A./:٪cq-%\~@OJuf TZfMX*{&)aRutCDεDN[,l'[:JKMr$cl&N OGV3Zb7oZ[KL*Xj̣]Mz= ĢQ$3L:[$Fec$ B2h]#Js 5-X pX7<V?c,lAg`Onh[y5iZ; ĢQ$3챓S= ȉ= \NIT0tB#e&Ubtw;؅O8~w(FӶϺsLHmvM26W&S.+vl "\ ΀>735 ]fCc_ Xdð8b8&D0%/5T42O +<#K(HKXзh򀱫9>f$N:t|MrҼ_kC\p'y+K>v} @'Rؙ">ߴ7v8ӧt1Vvϡ 'ND>+9N)X\!nzýn]dUEmPL[6?tg[H@:^,Ⱥoaqb61-Ax>N ~Et-2 ĢQ$3u>)h3jܮ '[zsBvҗʎ^()>#DF+么&S.+vl "\ ΀>735 MѐA[`h7,,N <}.*P?LJIԬbL ^1cAuk4zAv;I˕PQo$ЇŃ%e`[ҀT2|Ih̩}kT#L؀Cr2qGp,r$>\S>tQ#1K4WW'zz.$ 5~'Z*tfѰ %] sU`ﶽW-`Q!,T;ԶWmːkuՍ74%-ʀnim6UjnhsY⯘.{Xء 3tdܼ쟤'G^!{Kż 233_6xE\,}xeUD/;D%  ->'ylK2o .`խ 7@ &ymåup5SIC>Eډ+Ģ@쑆陒P~a[w3bUIzݬ5w!PŠaCE4}?K,Ȗ!Ă|Z6k|AgBW]lE\38ըj~uub ĢQ$3;tMYKS#sT8;5nxextLw4'Cy=g&DYOw]QUx64bC*࣡4}Wþf\09$^,(ԊpèGWTay9?(??b:fVRIWwYhqapBZyg}^V]a<~ڑڶ ĢQ$3O$|f,m<b\/'BEFⱀQA7Gc3ڠx;)4IzЗu&e ĢQ$33Y,}NdpkN!B4&_ ĢQ$3w9Ehҳs`F[?Ezr6(#Esx.@q`G闡>k ebt6Ofڦk)5xƸb "DDesyTf#%t{uh3ָ X$o(U}E ĢQ$3}[.WN2ѵ2 ч ĢQ$3UR41PN:E^Ç ĢQ$3l@G1gM En&Ig:Dn:UIs)ôd_+׀ު㙑uafY4Eɇ@jjL>ߔeYj88-Ut (@x( oMka<^cSƙ[)7s39嬢DҕC=GN;n`uXX $s?"T*Ӷ{Ks%oRfbU^I9^X3v9>O_[\.^V/:2m#[ImS@icTCFc 玪ctions::flattenSingleValue($text); $flags = self::matchFlags($matchMode); if ($rowDelimiter !== null) { $delimiter = self::buildDelimiter($rowDelimiter); $rows = ($delimiter === '()') ? [$text] : preg_split("/{$delimiter}/{$flags}", $text); } else { $rows = [$text]; } /** @var array $rows */ if ($ignoreEmpty === true) { $rows = array_values(array_filter( $rows, function ($row) { return $row !== ''; } )); } if ($columnDelimiter !== null) { $delimiter = self::buildDelimiter($columnDelimiter); array_walk( $rows, function (&$row) use ($delimiter, $flags, $ignoreEmpty): void { $row = ($delimiter === '()') ? [$row] : preg_split("/{$delimiter}/{$flags}", $row); /** @var array $row */ if ($ignoreEmpty === true) { $row = array_values(array_filter( $row, function ($value) { return $value !== ''; } )); } } ); if ($ignoreEmpty === true) { $rows = array_values(array_filter( $rows, function ($row) { return $row !== [] && $row !== ['']; } )); } } return self::applyPadding($rows, $padding); } /** * @param mixed $padding */ private static function applyPadding(array $rows, $padding): array { $columnCount = array_reduce( $rows, function (int $counter, array $row): int { return max($counter, count($row)); }, 0 ); return array_map( function (array $row) use ($columnCount, $padding): array { return (count($row) < $columnCount) ? array_merge($row, array_fill(0, $columnCount - count($row), $padding)) : $row; }, $rows ); } /** * @param null|array|string $delimiter the text that marks the point before which you want to split * Multiple delimiters can be passed as an array of string values */ private static function buildDelimiter($delimiter): string { $valueSet = Functions::flattenArray($delimiter); if (is_array($delimiter) && count($valueSet) > 1) { $quotedDelimiters = array_map( function ($delimiter) { return preg_quote($delimiter ?? '', '/'); }, $valueSet ); $delimiters = implode('|', $quotedDelimiters); return '(' . $delimiters . ')'; } return '(' . preg_quote(/** @scrutinizer ignore-type */ Functions::flattenSingleValue($delimiter), '/') . ')'; } private static function matchFlags(bool $matchMode): string { return ($matchMode === true) ? 'miu' : 'mu'; } public static function fromArray(array $array, int $format = 0): string { $result = []; foreach ($array as $row) { $cells = []; foreach ($row as $cellValue) { $value = ($format === 1) ? self::formatValueMode1($cellValue) : self::formatValueMode0($cellValue); $cells[] = $value; } $result[] = implode(($format === 1) ? ',' : ', ', $cells); } $result = implode(($format === 1) ? ';' : ', ', $result); return ($format === 1) ? '{' . $result . '}' : $result; } /** * @param mixed $cellValue */ private static function formatValueMode0($cellValue): string { if (is_bool($cellValue)) { return Calculation::getLocaleBoolean($cellValue ? 'TRUE' : 'FALSE'); } return (string) $cellValue; } /** * @param mixed $cellValue */ private static function formatValueMode1($cellValue): string { if (is_string($cellValue) && ErrorValue::isError($cellValue) === false) { return Calculation::FORMULA_STRING_QUOTE . $cellValue . Calculation::FORMULA_STRING_QUOTE; } elseif (is_bool($cellValue)) { return Calculation::getLocaleBoolean($cellValue ? 'TRUE' : 'FALSE'); } return (string) $cellValue; } }