@ 2015-03-10T07:20:25Z <?php
/* Projekt 1 - 09: XML Query v PHP 5 pro IPP 2014/2015
** Jmeno a prijemni: Tomas Hynek (c) 2015
** Login: xhynek09
*/
header("Content-type: text/xml; charset=utf-8");
//###################################################################################
//############################# HELP - NAPOVEDA #####################################
function help(){
echo "################################################################\n",
"############### Projekt 1 - XQR v PHP 5.3.3 ####################\n",
"############### Autor: Tomas Hynek (c) 2015 ####################\n",
"############### Login: xhynek09 ####################\n",
"############### Napoveda ke skriptu ####################\n",
"## --help vypise na standardni vystup napovedu skriptu.\n\n",
"## --input=filename\n\tzadany vstupni soubor muze byt zadan relativni cestou nebo absolutni cestou;v pripade, ze by\n\tnazev ci cesta obsahovala mezeru, tak musi byt uvedena cela cesta i se jmenem souboru v uvozovkach\n\t(znak uvozovek a rovnitka ve jmene soubory neni treba uvazovat); chybi-li tento parametr, tak je\n\tuvazovnan standardni vstup.\n\n",
"## --output=filename\n\tzadany vystupni soubor muze byt zadan relativni cestou nebo absolutni cestou; v pripade, ze by nazev\n\tci cesta obsahovala mezeru, tak musi byt uvedena cesta i se jmenem souboru v uvozovkach (znak uvozovek\n\ta rovnitka ve jmene soubory neni treba uvazovat); chybi-li tento parametr, tak je vystup presmerovan\n\tna standardni vystup; existuje-li jiz vystupni soubor, bude bez varovani prepsan, jinak bude vytvoren\n\tnovy soubor.\n\n",
"## --query='dotaz'\n\tzadany dotaz v dotazovacim jazyce definovanem nize (v pripade zadani timto zpusobem nebude dotaz\n\tobsahovat symbol apostrof).\n\n",
"## --qf=filename\n\tdotaz v dotazovacim jazyce definovanem nize zadany v externim textovem souboru (nelze kombinovat s --query).\n\n",
"## -n\tnegenerovat XML hlavicku na vystup skriptu.\n\n",
"## --root=element\n\tjmeno paroveho korenoveho elementu obalujici vysledky. Pokud nebude zadan, tak se vysledky neobaluji\n\tkorenovym elementem, ac to porusuje validitu XML.\n\n";
}
//###################################################################################
//############### SEPARATE QUERY - VYHODNOCENI VYRAZU SELECT ########################
function separate_query($query)
{
global $select;
global $limit;
global $from;
global $elem_or_atr;
global $operator;
global $literal;
global $matches_out;
global $type_liter;
global $condition;
global $from_all;
$regex = "/^(SELECT\s[a-z]+)".
"(\sLIMIT\s[0-9])*".
"(\sFROM\sROOT|\sFROM\s[a-z]+\x2E[a-z]+|\sFROM\s\x2E[a-z]+|\sFROM\s[a-z]+)".
"($|\sWHERE(\sNOT)?\s([a-z]+\x2E[a-z]+|\x2E[a-z]+|[a-z]+)\s".
"((CONTAINS|\x3D|\x3C|\x3E)\s(\x22\w+\x22)|(\x3D|\x3C|\x3E)\s([0-9]+)))\z/";
if (!preg_match_all($regex, $query, $matches_out)) // funkce pracuje s RV a naplni dotaz do pole dle pravidel
{
file_put_contents('php://stderr', "Error - bad grammar of query\n");
exit(80);
}
// $count_q = count($matches_out);
// for ($l=0; $l < $count_q; $l++)
// {
// print_r($matches_out[$l]);
// }
if (($matches_out[1][0]) !='') //SELECT element
{
$arr = explode("SELECT ", $matches_out[1][0]); // rozparsrovani na SELECT | element
$select = $arr[1]; // vyjmuti element do $select
echo ("select:".$select."\n");
}
if (($matches_out[2][0]) !='') //LIMIT number
{
$arr = explode(" LIMIT ", $matches_out[2][0]); // rozparsrovani na SELECT | element
$limit = $arr[1]; // vyjmuti element do $select
echo ($limit."\n");
}
if (($matches_out[3][0]) !='') //FROM <FROM-ELM>
{
$arr = explode(" FROM ", $matches_out[3][0]); // rozparsrovani na SELECT | element
$from = $arr[1]; // vyjmuti element do $select
echo ("from:".$from."\n");
if ($from == 'ROOT')
{$from_all = 1;}
}
if (($matches_out[4][0]) !='') //WHERE exists?
{
$condition = 1; // YES
}
if (($matches_out[5][0]) !='') //NOT
{
$arr = explode(" ", $matches_out[5][0]); // rozparsrovani na SELECT | element
$not = $arr[1];
echo ($not."\n");
}
if (($matches_out[6][0]) !='') //<ELEMENT-OR-ATTRIBUTE>
{
$elem_or_atr = $matches_out[6][0]; // ulozeni do promenne
echo ($elem_or_atr."\n");
}
if (($matches_out[8][0]) !='') //<RELATION-OPERATOR> |<|>|=|CONTAINS| pro STRING
{
$opr = $matches_out[10][0]; // ulozeni relation operatoru
if ($opr == '='){$operator=1;}
else if($opr == '>'){$operator=2;}
else {$operator=3;}
echo ($operator."\n");
}
if (($matches_out[9][0]) !='') //<LITERAL> STRING
{
$literal = $matches_out[9][0]; // ulozeni literalu - string
$type_liter = 1;
echo ($type_liter."\n");
}
if (($matches_out[10][0]) !='') //<RELATION-OPERATOR> |<|>|=| pro NUM
{
$opr = $matches_out[10][0]; // ulozeni relation operatoru
if ($opr == '='){$operator=1;}
else if($opr == '>'){$operator=2;}
else {$operator=3;}
echo ($operator."\n");
}
if (($matches_out[11][0]) !='') //<LITERAL> NUM
{
$literal = $matches_out[11][0]; // ulozeni literalu - num
$type_liter = 2;
echo ($type_liter."\n");
}
return;
}
//###################################################################################
//##################### PROHLEDAVANI a ZPRACOVANI WHERE #############################
function searchWhere($key, $array, $simple_obj)
{
if (array_key_exists($key, $array))
{
foreach ($array as $index => $subarray)
{
if ($index == $key)
{
if (is_object($subarray))
{
echo $index." je to object\n";
//$simple_obj = new SimpleXMLElement("<{$index}>{$key}</{$index}>");
$simple_obj->addChild($key, $subarray);
print_r($simple_obj);
}
echo("item find: {$index}=>{$key}\n");
}
}
return;
}
else
{
foreach ($array as $index => $subarray)
{
echo("RE-SEACHING {$index} FOR : {$key}\n");
return search($subarray, $key, $simple_obj);
}
}
return;
}
//###################################################################################
//#################### PROHLEDAVANI a ZPRACOVANI SELECT #############################
function search($array, $key, $simple_out)
{
global $select, $rt, $root_elem, $from;
if (!is_object($simple_out) && ($rt == 1))
{
$simple_out = new SimpleXMLElement("<{$root_elem}></{$root_elem}>");
}
if (array_key_exists($key, $array))
{
foreach ($array as $index => $subarray)
{
if ($index == $key )
{
if (is_object($subarray))
{
echo $index." je to object\n";
print_r($simple_out);
}
if ($rt != 1)
{
$simple_out = new SimpleXMLElement("<{$index}></{$index}>");
echo("item find: {$index}=>{$key}\n");
searchWhere($select, $subarray, $simple_out);
}
else
{ echo("item find: {$index}=>{$key}\n");
$elem = $simple_out->addChild($index);
searchWhere($select, $subarray, $elem);
}
}
return $simple_out;
}
}
else
{
foreach ($array as $index => $subarray)
{
echo("RE-SEACHING {$index} FOR : {$key}\n");
return search($subarray, $key, $simple_out);
}
}
return;
}
//###################################################################################
//################# PROHLEDAVANI a ZPRACOVANI PRI FROM ROOT #########################
function searchRoot($array, $key, $simple_out)
{
global $rt, $root_elem;
if (!is_object($simple_out) && ($rt == 1))
{
$simple_out = new SimpleXMLElement("<{$root_elem}></{$root_elem}>");
}
echo "zpracovavam ROOT\n";
if (array_key_exists($key, $array))
{
foreach ($array as $index => $subarray)
{
if ($index == $key )
{
if ($rt == 1) // pokud --root=element
{
$elem = $simple_out->addChild($index);
}
else // pokud neni zadan --root=
{
if (!is_object($simple_out)) // tady jeste nevim jeslti to je dobre, jestli vytvorit book jednou nebo dvakrat??
{ // viz sekvence prikazu php -d open_basedir="" xqr.php --input=xml02.in --qf=query02.qu
$simple_out = new SimpleXMLElement("<{$index}></{$index}>");
$elem = $simple_out;
}
}
foreach ($subarray as $child => $data)
{ echo("vypisek: {$child}=>{$data}\n");
$elem->addChild($child, $data);
}
}
}
return $simple_out;
}
else
{
foreach ($array as $index => $subarray)
{
echo("RE-SEACHING {$index} FOR : {$key}\n");
return searchRoot($subarray, $key, $simple_out);
}
}
return;
}
//###################################################################################
//########################## HLAVNI PROGRAM SKRIPTU #################################
//###################################################################################
$in = 0; // indikace parametru --input
$out = 0; // indikace parametru --output
$qr = 0; // indikace parametru --query
$qf = 0; // indikace parametru --qf
$rt = 0; // indikace parametru --root
$n = 0; // indikace parametru -n
$root=0; // 0-nic, 1-ROOT... jmeno paroveho korenoveho elementu obalujici vysledky
$type_liter=0; // 0-nic, 1-string, 2-num
$condition=0; // 0-bez podminky, 1-s podminkou
$xml_arr = 0; //
global $from, $from_all;
// $operator = 0; // 0-nic, 1-equal, 2-more, 3-less
//$input; // v stupni soubor
//$output; // vystupni soubor
//$query; // zadany dotaz v dotaz. jazyce
//$qfile; // zadany dotaz v externim textovem souboru
//$root_elem; // ulozen obalujici root
//$xml_arr_out;
//########################### ZPRACOVANI ARGUMENTU ##################################
for ($i = 0; $i < $argc; $i++)
{
if ($i > 0) // pokud prochazime druhy argument a vyse.....
{
if ((strpos($argv[$i], '--help')) !== false) // ---help
{
$help = explode("--help", $argv[$i]);
if (($argc > 2) || ($help[1] != "") || ($help[0] != ""))
{
file_put_contents('php://stderr', "Error - bad param\n");
exit(1); // spatny format parametru nebo zakazana kombinace parametru
}
help(); // konec skriptu bez chyby
exit(0);
}
else if ((strpos($argv[$i], '--input=')) !== false) // --input
{
$input = explode("--input=", $argv[$i]);
if (($input[1] == "") || ($input[0] != ""))
{
file_put_contents('php://stderr', "Error - bad param\n");
exit(1); // spatny format parametru nebo zakazana kombinace parametru
}
if (file_exists("$input[1]"))
{
fclose(STDIN);
$xml_arr = simplexml_load_file("$input[1]");
//echo "ZDE JE ROOT ELEMENT: ".$xml_arr->getName()."\n";
if($xml_arr === FALSE)
{
file_put_contents('php://stderr', "Error - file isnt exist\n");
exit(2);
}
//print_r($xml);
}
else
{
file_put_contents('php://stderr', "Error - file isnt exist\n");
exit(2);
}
$in += 1;
}
else if ((strpos($argv[$i], '--output=')) !== false) // --output
{
$output = explode("--output=", $argv[$i]);
if (($output[1] == "") || ($output[0] != ""))
{
file_put_contents('php://stderr', "Error - bad param\n");
exit(1); // spatny format parametru nebo zakazana kombinace parametru
}
//fclose(STDOUT);
$fopen_out = fopen("$output[1]", 'w');
$fopen_final_out = $output[1];
echo $fopen_out."\n";
$out += 1;
}
else if ((strpos($argv[$i], '--query=')) !== false) // --query
{
$query = explode("--query=", $argv[$i]);
if (($query[1] == "") || ($query[0] != ""))
{
file_put_contents('php://stderr', "Error - bad param\n");
exit(1); // spatny format parametru nebo zakazana kombinace parametru
}
separate_query($query[1]);
$qr += 1;
}
else if ((strpos($argv[$i], '--qf=')) !== false) // --qf
{
$qfile = explode("--qf=", $argv[$i]);
if (($qfile[1] == "") || ($qfile[0] != ""))
{
file_put_contents('php://stderr', "Error - bad param\n");
exit(1); // spatny format parametru nebo zakazana kombinace parametru
}
if (!(is_readable($qfile[1])))
{
file_put_contents('php://stderr', "Error - file isnt exist\n");
exit(2); // spatny format parametru nebo zakazana kombinace parametru
}
$query_string = file_get_contents($qfile[1]);
var_dump($query_string);
separate_query($query_string);
$qf += 1;
}
else if ((strpos($argv[$i], '--root=')) !== false) // --root
{
$root = explode("--root=", $argv[$i]);
if (($root[1] == "") || ($root[0] != ""))
{
file_put_contents('php://stderr', "Error - bad param\n");
exit(1); // spatny format parametru nebo zakazana kombinace parametru
}
$root_elem = $root[1];
$rt += 1;
}
else if ((strpos($argv[$i], '-n')) !== false) // -n
{
$n += 1;
}
else // jine argumenty nejsou povoleny
{
file_put_contents('php://stderr', "Error - bad param\n");
exit(1); // spatny format parametru nebo zakazana kombinace parametru
}
}
}
//###################################################################################
if (($in > 1)||($out > 1)||($qr > 1)||($qf > 1)||($rt > 1)||($n > 1)) // pokud se nejaky parametr opakuje
{
file_put_contents('php://stderr', "Error - bad param\n");
exit(1); // spatny format parametru nebo zakazana kombinace parametru
}
if (($qr > 0) && ($qf > 0))
{
file_put_contents('php://stderr', "Error - bad param\n");
exit(1); // spatny format parametru nebo zakazana kombinace parametru
}
print_r($xml_arr);
if ($from_all == 0)
{
$xml_out = search($xml_arr, $from, NULL);
}
else
{
$xml_out = searchRoot($xml_arr, $select, NULL);
}
echo"\n##### Konecna tabulka obejktu ##### \n";
//print_r($xml_out);
//var_dump($arr);
if (is_object($xml_out))
{ $xml_final_output = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
if ($xml_final_output = $xml_out->asXML()) // prevedeni zpet na XML
{ echo "wwwwwtttttttttttffffffffff\n";
if ($out == 1)
{
$xml_out->asXML("$fopen_final_out");
fclose($fopen_out);
}
else
{
echo $xml_final_output;
}
}
else
{
file_put_contents('php://stderr', "Error - pri prevodu na XML format!\n");
exit(100);
}
}
//else ////// totot haze exit 100 pri skriptu test01 ......whaaaaat??????
//{
// file_put_contents('php://stderr', "Error - pri prevodu na XML format!\n");
// exit(100);
//}
echo "\n";
exit(0); // konec skriptu bez chyby
Enable javascript to submit You have javascript disabled. You will not be able to edit any code.
Here you find the average performance (time & memory) of each version. A grayed out version indicates it didn't complete successfully (based on exit-code).
Version System time (s) User time (s) Memory (MiB) 8.3.6 0.009 0.006 18.55 8.3.5 0.008 0.010 22.04 8.3.4 0.009 0.006 18.82 8.3.3 0.012 0.003 19.17 8.3.2 0.000 0.008 20.41 8.3.1 0.012 0.003 22.02 8.3.0 0.004 0.004 19.14 8.2.18 0.013 0.010 18.66 8.2.17 0.006 0.009 22.96 8.2.16 0.015 0.000 22.14 8.2.15 0.003 0.006 24.18 8.2.14 0.004 0.004 24.66 8.2.13 0.004 0.004 26.16 8.2.12 0.004 0.004 19.80 8.2.11 0.010 0.000 21.11 8.2.10 0.008 0.008 17.80 8.2.9 0.014 0.007 18.01 8.2.8 0.004 0.004 18.05 8.2.7 0.009 0.000 17.80 8.2.6 0.004 0.004 18.16 8.2.5 0.003 0.006 18.10 8.2.4 0.005 0.003 21.02 8.2.3 0.006 0.003 19.55 8.2.2 0.003 0.005 17.90 8.2.1 0.003 0.005 18.21 8.2.0 0.008 0.000 18.00 8.1.28 0.009 0.006 25.92 8.1.27 0.004 0.004 19.05 8.1.26 0.008 0.000 26.35 8.1.25 0.005 0.003 28.09 8.1.24 0.009 0.000 23.93 8.1.23 0.009 0.003 21.31 8.1.22 0.000 0.009 17.90 8.1.21 0.004 0.004 19.10 8.1.20 0.006 0.003 17.47 8.1.19 0.000 0.008 17.60 8.1.18 0.005 0.005 18.10 8.1.17 0.003 0.005 18.75 8.1.16 0.004 0.004 19.07 8.1.15 0.004 0.004 18.99 8.1.14 0.004 0.004 17.69 8.1.13 0.000 0.008 17.94 8.1.12 0.000 0.007 17.64 8.1.11 0.003 0.005 17.63 8.1.10 0.004 0.004 17.68 8.1.9 0.005 0.003 17.68 8.1.8 0.000 0.008 17.65 8.1.7 0.000 0.007 17.63 8.1.6 0.006 0.003 17.67 8.1.5 0.006 0.003 17.60 8.1.4 0.003 0.006 17.59 8.1.3 0.004 0.004 17.89 8.1.2 0.004 0.004 17.79 8.1.1 0.004 0.007 17.79 8.1.0 0.003 0.006 17.71 8.0.30 0.000 0.008 19.85 8.0.29 0.003 0.006 17.00 8.0.28 0.004 0.004 18.64 8.0.27 0.000 0.007 17.38 8.0.26 0.003 0.003 17.51 8.0.25 0.000 0.008 17.10 8.0.24 0.004 0.004 17.10 8.0.23 0.004 0.004 17.26 8.0.22 0.005 0.002 17.08 8.0.21 0.003 0.003 17.09 8.0.20 0.000 0.008 17.19 8.0.19 0.003 0.006 17.06 8.0.18 0.000 0.008 17.18 8.0.17 0.000 0.008 17.21 8.0.16 0.008 0.000 17.20 8.0.15 0.004 0.004 17.15 8.0.14 0.004 0.004 17.14 8.0.13 0.000 0.006 13.62 8.0.12 0.003 0.006 16.94 8.0.11 0.004 0.004 17.13 8.0.10 0.004 0.004 17.02 8.0.9 0.004 0.004 17.01 8.0.8 0.006 0.016 17.21 8.0.7 0.004 0.004 17.11 8.0.6 0.004 0.004 17.04 8.0.5 0.000 0.008 17.07 8.0.3 0.014 0.010 17.36 8.0.2 0.009 0.010 17.41 8.0.1 0.003 0.005 17.07 8.0.0 0.008 0.011 17.03 7.4.33 0.003 0.003 15.03 7.4.32 0.004 0.004 16.80 7.4.30 0.007 0.000 16.84 7.4.29 0.004 0.004 16.69 7.4.28 0.006 0.003 16.70 7.4.27 0.004 0.004 16.60 7.4.26 0.008 0.000 16.59 7.4.25 0.008 0.000 16.77 7.4.24 0.003 0.005 16.75 7.4.23 0.004 0.004 16.91 7.4.22 0.017 0.017 16.85 7.4.21 0.004 0.018 16.70 7.4.20 0.005 0.003 16.89 7.4.16 0.008 0.008 16.52 7.4.15 0.015 0.011 17.40 7.4.14 0.005 0.013 17.86 7.4.13 0.009 0.008 16.64 7.4.12 0.010 0.007 16.76 7.4.11 0.013 0.012 16.72 7.4.10 0.013 0.010 16.64 7.4.9 0.012 0.006 16.79 7.4.8 0.003 0.018 19.39 7.4.7 0.010 0.010 16.70 7.4.6 0.014 0.009 16.53 7.4.5 0.000 0.008 16.83 7.4.4 0.003 0.013 16.68 7.4.3 0.012 0.006 16.56 7.4.0 0.003 0.013 15.39 7.3.33 0.003 0.003 13.48 7.3.32 0.000 0.005 13.54 7.3.31 0.005 0.003 16.41 7.3.30 0.000 0.007 16.53 7.3.29 0.008 0.007 16.52 7.3.28 0.008 0.011 16.56 7.3.27 0.004 0.014 17.40 7.3.26 0.009 0.009 16.48 7.3.25 0.011 0.007 16.67 7.3.24 0.013 0.006 16.84 7.3.23 0.018 0.003 16.64 7.3.21 0.019 0.000 16.75 7.3.20 0.017 0.005 19.39 7.3.19 0.010 0.007 16.74 7.3.18 0.012 0.006 16.66 7.3.17 0.008 0.014 16.81 7.3.16 0.004 0.013 16.68 7.2.33 0.007 0.017 16.83 7.2.32 0.005 0.012 16.95 7.2.31 0.006 0.015 16.68 7.2.30 0.013 0.013 17.01 7.2.29 0.012 0.006 16.86 7.2.0 0.004 0.011 19.56 7.1.20 0.010 0.005 15.70 7.1.10 0.003 0.006 18.13 7.1.7 0.013 0.003 16.93 7.1.6 0.010 0.014 19.57 7.1.5 0.010 0.014 16.97 7.1.0 0.007 0.073 22.45 7.0.20 0.004 0.007 16.84 7.0.14 0.010 0.047 21.96 7.0.10 0.010 0.077 20.13 7.0.9 0.010 0.083 20.12 7.0.8 0.007 0.087 20.09 7.0.7 0.010 0.077 20.11 7.0.6 0.003 0.060 19.96 7.0.5 0.017 0.077 20.49 7.0.4 0.020 0.043 20.11 7.0.3 0.003 0.047 20.08 7.0.2 0.007 0.043 20.05 7.0.1 0.010 0.037 20.10 7.0.0 0.003 0.043 20.06 5.6.28 0.003 0.077 21.15 5.6.25 0.010 0.063 20.71 5.6.24 0.010 0.083 20.63 5.6.23 0.013 0.077 20.86 5.6.22 0.013 0.047 20.70 5.6.21 0.020 0.070 20.71 5.6.20 0.003 0.083 21.06 5.6.19 0.003 0.057 21.13 5.6.18 0.013 0.037 21.12 5.6.17 0.003 0.043 21.26 5.6.16 0.003 0.040 21.13 5.6.15 0.000 0.043 21.17 5.6.14 0.003 0.043 21.05 5.6.13 0.007 0.037 21.11 5.6.12 0.003 0.057 21.03 5.6.11 0.000 0.047 21.13 5.6.10 0.007 0.037 21.07 5.6.9 0.007 0.037 21.00 5.6.8 0.007 0.033 20.35 5.6.7 0.003 0.080 20.54 5.6.6 0.003 0.040 20.48 5.6.5 0.003 0.043 20.42 5.6.4 0.007 0.047 20.39 5.6.3 0.010 0.030 20.39 5.6.2 0.013 0.033 20.57 5.6.1 0.013 0.030 20.44 5.6.0 0.010 0.040 20.53 5.5.38 0.000 0.087 20.59 5.5.37 0.010 0.077 20.44 5.5.36 0.013 0.077 20.43 5.5.35 0.010 0.080 20.47 5.5.34 0.027 0.037 20.89 5.5.33 0.003 0.067 20.82 5.5.32 0.010 0.037 20.87 5.5.31 0.003 0.040 21.00 5.5.30 0.007 0.047 20.80 5.5.29 0.010 0.083 20.99 5.5.28 0.003 0.050 20.82 5.5.27 0.003 0.043 20.92 5.5.26 0.007 0.070 20.95 5.5.25 0.000 0.043 20.82 5.5.24 0.000 0.040 20.21 5.5.23 0.003 0.040 20.33 5.5.22 0.007 0.037 20.33 5.5.21 0.007 0.037 20.27 5.5.20 0.010 0.060 20.37 5.5.19 0.007 0.037 20.23 5.5.18 0.010 0.037 20.20 5.5.16 0.003 0.040 20.36 5.5.15 0.003 0.040 20.27 5.5.14 0.007 0.037 20.23 5.5.13 0.003 0.040 20.19 5.5.12 0.007 0.037 20.32 5.5.11 0.010 0.047 20.32 5.5.10 0.003 0.037 20.10 5.5.9 0.007 0.033 20.09 5.5.8 0.010 0.033 20.20 5.5.7 0.000 0.047 20.13 5.5.6 0.007 0.037 20.02 5.5.5 0.003 0.043 20.24 5.5.4 0.010 0.060 20.14 5.5.3 0.013 0.063 20.24 5.5.2 0.003 0.080 20.00 5.5.1 0.007 0.070 20.23 5.5.0 0.003 0.080 20.06 5.4.45 0.010 0.057 19.37 5.4.44 0.007 0.040 19.50 5.4.43 0.003 0.063 19.50 5.4.42 0.007 0.043 19.24 5.4.41 0.003 0.040 19.36 5.4.40 0.010 0.063 19.17 5.4.39 0.010 0.040 19.23 5.4.38 0.007 0.033 19.23 5.4.37 0.003 0.060 19.05 5.4.36 0.000 0.040 18.89 5.4.35 0.007 0.033 19.09 5.4.34 0.003 0.040 19.08 5.4.32 0.013 0.043 19.09 5.4.31 0.000 0.040 19.14 5.4.30 0.003 0.050 19.13 5.4.29 0.000 0.047 19.16 5.4.28 0.007 0.033 19.09 5.4.27 0.007 0.033 19.16 5.4.26 0.007 0.037 19.16 5.4.25 0.003 0.037 18.91 5.4.24 0.007 0.057 19.22 5.4.23 0.007 0.037 18.98 5.4.22 0.000 0.043 19.22 5.4.21 0.003 0.087 19.13 5.4.20 0.000 0.080 18.96 5.4.19 0.013 0.063 19.22 5.4.18 0.007 0.047 19.05 5.4.17 0.000 0.080 19.08 5.4.16 0.013 0.073 18.91 5.4.15 0.007 0.077 19.21 5.4.14 0.010 0.043 16.57 5.4.13 0.003 0.073 16.47 5.4.12 0.003 0.077 16.48 5.4.11 0.007 0.073 16.53 5.4.10 0.010 0.067 16.34 5.4.9 0.013 0.067 16.45 5.4.8 0.017 0.060 16.40 5.4.7 0.007 0.073 16.43 5.4.6 0.000 0.063 16.40 5.4.5 0.003 0.040 16.46 5.4.4 0.010 0.070 16.48 5.4.3 0.003 0.053 16.46 5.4.2 0.007 0.040 16.51 5.4.1 0.013 0.070 16.50 5.4.0 0.003 0.060 15.95
preferences:dark mode live preview
66.03 ms | 401 KiB | 5 Q