@ 2013-08-28T12:41:03Z <?php
class FirePHP {
/**
* Gets singleton instance of FirePHP
*
* @param boolean $AutoCreate
* @return FirePHP
*/
public static function getInstance($AutoCreate=false) {
if($AutoCreate===true && !self::$instance) {
self::init();
}
return self::$instance;
}
/**
* Creates FirePHP object and stores it for singleton access
*
* @return FirePHP
*/
public static function init() {
return self::$instance = new self();
}
/**
* Enable and disable logging to Firebug
*
* @param boolean $Enabled TRUE to enable, FALSE to disable
* @return void
*/
public function setEnabled($Enabled) {
$this->enabled = $Enabled;
}
/**
* Check if logging is enabled
*
* @return boolean TRUE if enabled
*/
public function getEnabled() {
return $this->enabled;
}
/**
* Specify a filter to be used when encoding an object
*
* Filters are used to exclude object members.
*
* @param string $Class The class name of the object
* @param array $Filter An array or members to exclude
* @return void
*/
public function setObjectFilter($Class, $Filter) {
$this->objectFilters[$Class] = $Filter;
}
/**
* Register FirePHP as your error handler
*
* Will throw exceptions for each php error.
*/
public function registerErrorHandler()
{
//NOTE: The following errors will not be caught by this error handler:
// E_ERROR, E_PARSE, E_CORE_ERROR,
// E_CORE_WARNING, E_COMPILE_ERROR,
// E_COMPILE_WARNING, E_STRICT
set_error_handler(array($this,'errorHandler'));
}
/**
* FirePHP's error handler
*
* Throws exception for each php error that will occur.
*
* @param int $errno
* @param string $errstr
* @param string $errfile
* @param int $errline
* @param array $errcontext
*/
public function errorHandler($errno, $errstr, $errfile, $errline, $errcontext)
{
// Don't throw exception if error reporting is switched off
if (error_reporting() == 0) {
return;
}
// Only throw exceptions for errors we are asking for
if (error_reporting() & $errno) {
throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}
}
/**
* Register FirePHP as your exception handler
*/
public function registerExceptionHandler()
{
set_exception_handler(array($this,'exceptionHandler'));
}
/**
* FirePHP's exception handler
*
* Logs all exceptions to your firebug console and then stops the script.
*
* @param Exception $Exception
* @throws Exception
*/
function exceptionHandler($Exception) {
$this->fb($Exception);
}
/**
* Set custom processor url for FirePHP
*
* @param string $URL
*/
public function setProcessorUrl($URL)
{
$this->setHeader('X-FirePHP-ProcessorURL', $URL);
}
/**
* Set custom renderer url for FirePHP
*
* @param string $URL
*/
public function setRendererUrl($URL)
{
$this->setHeader('X-FirePHP-RendererURL', $URL);
}
/**
* Start a group for following messages
*
* @param string $Name
* @return true
* @throws Exception
*/
public function group($Name) {
return $this->fb(null, $Name, FirePHP::GROUP_START);
}
/**
* Ends a group you have started before
*
* @return true
* @throws Exception
*/
public function groupEnd() {
return $this->fb(null, null, FirePHP::GROUP_END);
}
/**
* Log object with label to firebug console
*
* @see FirePHP::LOG
* @param mixes $Object
* @param string $Label
* @return true
* @throws Exception
*/
public function log($Object, $Label=null) {
return $this->fb($Object, $Label, FirePHP::LOG);
}
/**
* Log object with label to firebug console
*
* @see FirePHP::INFO
* @param mixes $Object
* @param string $Label
* @return true
* @throws Exception
*/
public function info($Object, $Label=null) {
return $this->fb($Object, $Label, FirePHP::INFO);
}
/**
* Log object with label to firebug console
*
* @see FirePHP::WARN
* @param mixes $Object
* @param string $Label
* @return true
* @throws Exception
*/
public function warn($Object, $Label=null) {
return $this->fb($Object, $Label, FirePHP::WARN);
}
/**
* Log object with label to firebug console
*
* @see FirePHP::ERROR
* @param mixes $Object
* @param string $Label
* @return true
* @throws Exception
*/
public function error($Object, $Label=null) {
return $this->fb($Object, $Label, FirePHP::ERROR);
}
/**
* Dumps key and variable to firebug server panel
*
* @see FirePHP::DUMP
* @param string $Key
* @param mixed $Variable
* @return true
* @throws Exception
*/
public function dump($Key, $Variable) {
return $this->fb($Variable, $Key, FirePHP::DUMP);
}
/**
* Log a trace in the firebug console
*
* @see FirePHP::TRACE
* @param string $Label
* @return true
* @throws Exception
*/
public function trace($Label) {
return $this->fb($Label, FirePHP::TRACE);
}
/**
* Log a table in the firebug console
*
* @see FirePHP::TABLE
* @param string $Label
* @param string $Table
* @return true
* @throws Exception
*/
public function table($Label, $Table) {
return $this->fb($Table, $Label, FirePHP::TABLE);
}
/**
* Check if FirePHP is installed on client
*
* @return boolean
*/
public function detectClientExtension() {
/* Check if FirePHP is installed on client */
if(!@preg_match_all('/\sFirePHP\/([\.|\d]*)\s?/si',$this->getUserAgent(),$m) ||
!version_compare($m[1][0],'0.0.6','>=')) {
return false;
}
return true;
}
/**
* Log varible to Firebug
*
* @see http://www.firephp.org/Wiki/Reference/Fb
* @param mixed $Object The variable to be logged
* @return true Return TRUE if message was added to headers, FALSE otherwise
* @throws Exception
*/
public function fb($Object) {
if(!$this->enabled) {
return false;
}
if (headers_sent($filename, $linenum)) {
throw $this->newException('Headers already sent in '.$filename.' on line '.$linenum.'. Cannot send log data to FirePHP. You must have Output Buffering enabled via ob_start() or output_buffering ini directive.');
}
$Type = null;
$Label = null;
if(func_num_args()==1) {
} else
if(func_num_args()==2) {
switch(func_get_arg(1)) {
case self::LOG:
case self::INFO:
case self::WARN:
case self::ERROR:
case self::DUMP:
case self::TRACE:
case self::EXCEPTION:
case self::TABLE:
case self::GROUP_START:
case self::GROUP_END:
$Type = func_get_arg(1);
break;
default:
$Label = func_get_arg(1);
break;
}
} else
if(func_num_args()==3) {
$Type = func_get_arg(2);
$Label = func_get_arg(1);
} else {
throw $this->newException('Wrong number of arguments to fb() function!');
}
if(!$this->detectClientExtension()) {
return false;
}
$meta = array();
$skipFinalObjectEncode = false;
if($Object instanceof Exception) {
$meta['file'] = $this->_escapeTraceFile($Object->getFile());
$meta['line'] = $Object->getLine();
$trace = $Object->getTrace();
if($Object instanceof ErrorException
&& isset($trace[0]['function'])
&& $trace[0]['function']=='errorHandler'
&& isset($trace[0]['class'])
&& $trace[0]['class']=='FirePHP') {
$severity = false;
switch($Object->getSeverity()) {
case E_WARNING: $severity = 'E_WARNING'; break;
case E_NOTICE: $severity = 'E_NOTICE'; break;
case E_USER_ERROR: $severity = 'E_USER_ERROR'; break;
case E_USER_WARNING: $severity = 'E_USER_WARNING'; break;
case E_USER_NOTICE: $severity = 'E_USER_NOTICE'; break;
case E_STRICT: $severity = 'E_STRICT'; break;
case E_RECOVERABLE_ERROR: $severity = 'E_RECOVERABLE_ERROR'; break;
case E_DEPRECATED: $severity = 'E_DEPRECATED'; break;
case E_USER_DEPRECATED: $severity = 'E_USER_DEPRECATED'; break;
}
$Object = array('Class'=>get_class($Object),
'Message'=>$severity.': '.$Object->getMessage(),
'File'=>$this->_escapeTraceFile($Object->getFile()),
'Line'=>$Object->getLine(),
'Type'=>'trigger',
'Trace'=>$this->_escapeTrace(array_splice($trace,2)));
$skipFinalObjectEncode = true;
} else {
$Object = array('Class'=>get_class($Object),
'Message'=>$Object->getMessage(),
'File'=>$this->_escapeTraceFile($Object->getFile()),
'Line'=>$Object->getLine(),
'Type'=>'throw',
'Trace'=>$this->_escapeTrace($trace));
$skipFinalObjectEncode = true;
}
$Type = self::EXCEPTION;
} else
if($Type==self::TRACE) {
$trace = debug_backtrace();
if(!$trace) return false;
for( $i=0 ; $i<sizeof($trace) ; $i++ ) {
if(isset($trace[$i]['class'])
&& isset($trace[$i]['file'])
&& ($trace[$i]['class']=='FirePHP'
|| $trace[$i]['class']=='FB')
&& (substr($this->_standardizePath($trace[$i]['file']),-18,18)=='FirePHPCore/fb.php'
|| substr($this->_standardizePath($trace[$i]['file']),-29,29)=='FirePHPCore/FirePHP.class.php')) {
/* Skip - FB::trace(), FB::send(), $firephp->trace(), $firephp->fb() */
} else
if(isset($trace[$i]['class'])
&& isset($trace[$i+1]['file'])
&& $trace[$i]['class']=='FirePHP'
&& substr($this->_standardizePath($trace[$i+1]['file']),-18,18)=='FirePHPCore/fb.php') {
/* Skip fb() */
} else
if($trace[$i]['function']=='fb'
|| $trace[$i]['function']=='trace'
|| $trace[$i]['function']=='send') {
$Object = array('Class'=>isset($trace[$i]['class'])?$trace[$i]['class']:'',
'Type'=>isset($trace[$i]['type'])?$trace[$i]['type']:'',
'Function'=>isset($trace[$i]['function'])?$trace[$i]['function']:'',
'Message'=>$trace[$i]['args'][0],
'File'=>isset($trace[$i]['file'])?$this->_escapeTraceFile($trace[$i]['file']):'',
'Line'=>isset($trace[$i]['line'])?$trace[$i]['line']:'',
'Args'=>isset($trace[$i]['args'])?$this->encodeObject($trace[$i]['args']):'',
'Trace'=>$this->_escapeTrace(array_splice($trace,$i+1)));
$skipFinalObjectEncode = true;
$meta['file'] = isset($trace[$i]['file'])?$this->_escapeTraceFile($trace[$i]['file']):'';
$meta['line'] = isset($trace[$i]['line'])?$trace[$i]['line']:'';
break;
}
}
} else
if($Type==self::TABLE) {
if(isset($Object[0]) && is_string($Object[0])) {
$Object[1] = $this->encodeTable($Object[1]);
} else {
$Object = $this->encodeTable($Object);
}
$skipFinalObjectEncode = true;
} else {
if($Type===null) {
$Type = self::LOG;
}
}
if($this->options['includeLineNumbers']) {
if(!isset($meta['file']) || !isset($meta['line'])) {
$trace = debug_backtrace();
for( $i=0 ; $trace && $i<sizeof($trace) ; $i++ ) {
if(isset($trace[$i]['class'])
&& isset($trace[$i]['file'])
&& ($trace[$i]['class']=='FirePHP'
|| $trace[$i]['class']=='FB')
&& (substr($this->_standardizePath($trace[$i]['file']),-18,18)=='FirePHPCore/fb.php'
|| substr($this->_standardizePath($trace[$i]['file']),-29,29)=='FirePHPCore/FirePHP.class.php')) {
/* Skip - FB::trace(), FB::send(), $firephp->trace(), $firephp->fb() */
} else
if(isset($trace[$i]['class'])
&& isset($trace[$i+1]['file'])
&& $trace[$i]['class']=='FirePHP'
&& substr($this->_standardizePath($trace[$i+1]['file']),-18,18)=='FirePHPCore/fb.php') {
/* Skip fb() */
} else
if(isset($trace[$i]['file'])
&& substr($this->_standardizePath($trace[$i]['file']),-18,18)=='FirePHPCore/fb.php') {
/* Skip FB::fb() */
} else {
$meta['file'] = isset($trace[$i]['file'])?$this->_escapeTraceFile($trace[$i]['file']):'';
$meta['line'] = isset($trace[$i]['line'])?$trace[$i]['line']:'';
break;
}
}
}
} else {
unset($meta['file']);
unset($meta['line']);
}
$this->setHeader('X-Wf-Protocol-1','http://meta.wildfirehq.org/Protocol/JsonStream/0.2');
$this->setHeader('X-Wf-1-Plugin-1','http://meta.firephp.org/Wildfire/Plugin/FirePHP/Library-FirePHPCore/'.self::VERSION);
$structure_index = 1;
if($Type==self::DUMP) {
$structure_index = 2;
$this->setHeader('X-Wf-1-Structure-2','http://meta.firephp.org/Wildfire/Structure/FirePHP/Dump/0.1');
} else {
$this->setHeader('X-Wf-1-Structure-1','http://meta.firephp.org/Wildfire/Structure/FirePHP/FirebugConsole/0.1');
}
if($Type==self::DUMP) {
$msg = '{"'.$Label.'":'.$this->jsonEncode($Object, $skipFinalObjectEncode).'}';
} else {
$msg_meta = array('Type'=>$Type);
if($Label!==null) {
$msg_meta['Label'] = $Label;
}
if(isset($meta['file'])) {
$msg_meta['File'] = $meta['file'];
}
if(isset($meta['line'])) {
$msg_meta['Line'] = $meta['line'];
}
$msg = '['.$this->jsonEncode($msg_meta).','.$this->jsonEncode($Object, $skipFinalObjectEncode).']';
}
$parts = explode("\n",chunk_split($msg, 5000, "\n"));
for( $i=0 ; $i<count($parts) ; $i++) {
$part = $parts[$i];
if ($part) {
if(count($parts)>2) {
// Message needs to be split into multiple parts
$this->setHeader('X-Wf-1-'.$structure_index.'-'.'1-'.$this->messageIndex,
(($i==0)?strlen($msg):'')
. '|' . $part . '|'
. (($i<count($parts)-2)?'\\':''));
} else {
$this->setHeader('X-Wf-1-'.$structure_index.'-'.'1-'.$this->messageIndex,
strlen($part) . '|' . $part . '|');
}
$this->messageIndex++;
if ($this->messageIndex > 99999) {
throw new Exception('Maximum number (99,999) of messages reached!');
}
}
}
$this->setHeader('X-Wf-1-Index',$this->messageIndex-1);
return true;
}
/**
* Standardizes path for windows systems.
*
* @param string $Path
* @return string
*/
protected function _standardizePath($Path) {
}
/**
* Escape trace path for windows systems
*
* @param array $Trace
* @return array
*/
protected function _escapeTrace($Trace) {
if(!$Trace) return $Trace;
for( $i=0 ; $i<sizeof($Trace) ; $i++ ) {
if(isset($Trace[$i]['file'])) {
$Trace[$i]['file'] = $this->_escapeTraceFile($Trace[$i]['file']);
}
if(isset($Trace[$i]['args'])) {
$Trace[$i]['args'] = $this->encodeObject($Trace[$i]['args']);
}
}
return $Trace;
}
/**
* Escape file information of trace for windows systems
*
* @param string $File
* @return string
*/
protected function _escapeTraceFile($File) {
/* Check if we have a windows filepath */
if(strpos($File,'\\')) {
/* First strip down to single \ */
$file = preg_replace('/\\\\+/','\\',$File);
return $file;
}
return $File;
}
/**
* Send header
*
* @param string $Name
* @param string_type $Value
*/
protected function setHeader($Name, $Value) {
return header($Name.': '.$Value);
}
/**
* Get user agent
*
* @return string|false
*/
protected function getUserAgent() {
if(!isset($_SERVER['HTTP_USER_AGENT'])) return false;
return $_SERVER['HTTP_USER_AGENT'];
}
/**
* Returns a new exception
*
* @param string $Message
* @return Exception
*/
protected function newException($Message) {
return new Exception($Message);
}
/**
* Encode an object into a JSON string
*
* Uses PHP's jeson_encode() if available
*
* @param object $Object The object to be encoded
* @return string The JSON string
*/
public function jsonEncode($Object, $skipObjectEncode=false)
{
}
/**
* Encodes a table by encoding each row and column with encodeObject()
*
* @param array $Table The table to be encoded
* @return array
*/
protected function encodeTable($Table) {
}
/**
* Encodes an object including members with
* protected and private visibility
*
* @param Object $Object The object to be encoded
* @param int $Depth The current traversal depth
* @return array All members of the object
*/
protected function encodeObject($Object, $ObjectDepth = 1, $ArrayDepth = 1)
{
}
/**
* Returns true if $string is valid UTF-8 and false otherwise.
*
* @param mixed $str String to be tested
* @return boolean
*/
protected static function is_utf8($str) {
}
private function json_encode($var)
{
}
private function json_name_value($name, $value)
{
}
}
function ciao()
{
$out = '<pre>';
$args = func_get_args();
if(!empty($args))
{
// var_export() causes fatal errors on recursion...
ob_start();
ini_set('xdebug.var_display_max_depth', 4);
var_dump($args);
$out .= ob_get_contents()."\n\n";
ob_end_clean();
}
$out .= get_backtrace(1);
die($out);
}
class A {
function B()
{
while (ob_get_level() > 1)
ob_end_flush();
// store possible trailing content
$content = ob_get_clean();
// start an output buffer which cannot be flushed (3rd parameter is false)
// callback function get all output and corrects Content-Length header
ob_start(function($buffer) {
ciao($buffer);
}, 0, false);
}
}
$a = new A;
$a->B();
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.004 0.011 18.43 8.3.5 0.024 0.005 21.98 8.3.4 0.009 0.012 18.92 8.3.3 0.022 0.000 18.79 8.3.2 0.000 0.009 19.02 8.3.1 0.008 0.011 21.05 8.3.0 0.000 0.008 21.90 8.2.18 0.010 0.013 16.98 8.2.17 0.009 0.006 22.96 8.2.16 0.004 0.011 20.73 8.2.15 0.006 0.003 24.18 8.2.14 0.010 0.000 24.66 8.2.13 0.006 0.009 26.16 8.2.12 0.000 0.008 21.11 8.2.11 0.007 0.003 22.27 8.2.10 0.008 0.004 17.97 8.2.9 0.005 0.003 19.30 8.2.8 0.004 0.004 18.18 8.2.7 0.008 0.000 17.88 8.2.6 0.003 0.006 18.18 8.2.5 0.006 0.003 18.07 8.2.4 0.005 0.003 18.47 8.2.3 0.000 0.009 19.90 8.2.2 0.008 0.000 17.82 8.2.1 0.008 0.000 17.98 8.2.0 0.005 0.003 17.85 8.1.27 0.004 0.004 23.99 8.1.26 0.009 0.000 26.35 8.1.25 0.004 0.004 28.09 8.1.24 0.003 0.007 22.55 8.1.23 0.003 0.008 21.27 8.1.22 0.009 0.000 18.77 8.1.21 0.006 0.003 19.13 8.1.20 0.006 0.003 17.60 8.1.19 0.004 0.004 17.78 8.1.18 0.003 0.005 18.10 8.1.17 0.004 0.004 18.78 8.1.16 0.000 0.008 19.04 8.1.15 0.005 0.003 18.91 8.1.14 0.004 0.004 17.73 8.1.13 0.000 0.007 18.12 8.1.12 0.004 0.004 17.59 8.1.11 0.000 0.008 17.67 8.1.10 0.004 0.004 17.58 8.1.9 0.004 0.007 17.59 8.1.8 0.000 0.008 17.59 8.1.7 0.000 0.008 17.64 8.1.6 0.003 0.006 17.79 8.1.5 0.009 0.000 17.73 8.1.4 0.009 0.000 17.64 8.1.3 0.000 0.008 17.76 8.1.2 0.003 0.006 17.93 8.1.1 0.000 0.008 17.82 8.1.0 0.000 0.008 17.52 8.0.30 0.004 0.004 20.15 8.0.29 0.000 0.007 17.41 8.0.28 0.004 0.004 18.68 8.0.27 0.000 0.007 17.35 8.0.26 0.004 0.004 17.16 8.0.25 0.005 0.003 17.28 8.0.24 0.004 0.008 17.15 8.0.23 0.005 0.003 17.33 8.0.22 0.004 0.004 17.10 8.0.21 0.006 0.006 17.24 8.0.20 0.003 0.003 17.09 8.0.19 0.004 0.004 17.27 8.0.18 0.004 0.004 17.11 8.0.17 0.006 0.003 17.23 8.0.16 0.004 0.004 17.21 8.0.15 0.000 0.009 17.16 8.0.14 0.003 0.005 17.21 8.0.13 0.000 0.006 13.66 8.0.12 0.008 0.000 17.04 8.0.11 0.004 0.004 17.20 8.0.10 0.008 0.000 17.21 8.0.9 0.004 0.004 17.22 8.0.8 0.009 0.006 17.14 8.0.7 0.004 0.004 17.08 8.0.6 0.008 0.000 17.17 8.0.5 0.011 0.000 17.08 8.0.3 0.007 0.012 17.43 8.0.2 0.007 0.012 17.42 8.0.1 0.004 0.004 17.38 8.0.0 0.011 0.011 17.03 7.4.33 0.003 0.003 14.83 7.4.32 0.007 0.000 16.80 7.4.30 0.000 0.006 16.74 7.4.29 0.008 0.000 16.72 7.4.28 0.007 0.003 16.73 7.4.27 0.005 0.003 16.64 7.4.26 0.003 0.003 13.43 7.4.25 0.006 0.003 16.72 7.4.24 0.005 0.003 16.84 7.4.23 0.004 0.004 16.50 7.4.22 0.008 0.012 16.69 7.4.21 0.006 0.012 16.77 7.4.20 0.003 0.005 16.83 7.4.19 0.004 0.004 16.72 7.4.16 0.012 0.006 16.64 7.4.15 0.012 0.006 17.40 7.4.14 0.006 0.014 17.86 7.4.13 0.009 0.009 16.65 7.4.12 0.009 0.009 16.78 7.4.11 0.007 0.010 16.83 7.4.10 0.007 0.010 16.64 7.4.9 0.004 0.015 16.71 7.4.8 0.007 0.010 19.37 7.4.7 0.011 0.007 16.73 7.4.6 0.000 0.017 16.70 7.4.5 0.000 0.007 16.49 7.4.4 0.009 0.006 22.27 7.4.3 0.010 0.008 16.84 7.4.0 0.008 0.008 15.18 7.3.33 0.000 0.005 13.38 7.3.32 0.002 0.005 13.38 7.3.31 0.007 0.000 16.62 7.3.30 0.005 0.003 16.47 7.3.29 0.007 0.010 16.61 7.3.28 0.007 0.010 16.59 7.3.27 0.010 0.007 17.40 7.3.26 0.012 0.009 18.24 7.3.25 0.011 0.013 16.65 7.3.24 0.003 0.014 16.80 7.3.23 0.011 0.008 16.74 7.3.21 0.008 0.012 16.54 7.3.20 0.012 0.006 19.39 7.3.19 0.012 0.006 16.67 7.3.18 0.003 0.014 16.82 7.3.17 0.003 0.014 16.77 7.3.16 0.011 0.006 16.64 7.3.12 0.005 0.012 15.24 7.3.11 0.004 0.007 15.09 7.3.10 0.003 0.009 15.09 7.3.9 0.007 0.003 15.13 7.3.8 0.004 0.011 14.77 7.3.7 0.012 0.003 14.90 7.3.6 0.000 0.014 14.98 7.3.5 0.003 0.016 14.91 7.3.4 0.010 0.006 14.71 7.3.3 0.007 0.007 15.05 7.3.2 0.007 0.010 16.73 7.3.1 0.003 0.013 16.55 7.3.0 0.003 0.009 16.42 7.2.33 0.004 0.016 17.00 7.2.32 0.011 0.007 16.73 7.2.31 0.012 0.006 16.98 7.2.30 0.012 0.006 17.01 7.2.29 0.008 0.009 17.07 7.2.25 0.013 0.006 15.50 7.2.24 0.003 0.017 15.39 7.2.23 0.011 0.003 15.25 7.2.22 0.006 0.006 15.37 7.2.21 0.007 0.007 15.47 7.2.20 0.003 0.015 15.28 7.2.19 0.006 0.006 14.91 7.2.18 0.004 0.012 15.10 7.2.17 0.010 0.007 15.38 7.2.6 0.005 0.008 17.00 7.2.0 0.007 0.007 19.46 7.1.33 0.003 0.010 15.80 7.1.32 0.009 0.003 15.54 7.1.31 0.000 0.009 15.90 7.1.30 0.003 0.007 15.76 7.1.29 0.007 0.011 15.88 7.1.28 0.007 0.007 15.71 7.1.27 0.003 0.010 15.59 7.1.26 0.003 0.012 15.78 7.1.20 0.011 0.003 15.46 7.1.10 0.009 0.003 18.21 7.1.7 0.004 0.004 17.12 7.1.6 0.010 0.017 19.40 7.1.5 0.010 0.010 16.87 7.1.0 0.003 0.050 22.36 7.0.20 0.003 0.006 16.68 7.0.14 0.007 0.067 21.96 7.0.10 0.003 0.043 20.16 7.0.9 0.030 0.077 20.09 7.0.8 0.000 0.083 20.20 7.0.7 0.007 0.063 20.10 7.0.6 0.017 0.067 20.08 7.0.5 0.007 0.050 20.56 7.0.4 0.010 0.080 20.16 7.0.3 0.007 0.040 19.93 7.0.2 0.003 0.043 20.18 7.0.1 0.003 0.043 20.09 7.0.0 0.007 0.040 20.10 5.6.28 0.003 0.073 21.27 5.6.25 0.010 0.073 20.68 5.6.24 0.000 0.070 20.86 5.6.23 0.007 0.080 20.63 5.6.22 0.007 0.073 20.68 5.6.21 0.010 0.077 20.83 5.6.20 0.023 0.073 21.21 5.6.19 0.023 0.073 21.27 5.6.18 0.007 0.087 21.21 5.6.17 0.020 0.037 21.18 5.6.16 0.000 0.057 21.30 5.6.15 0.003 0.047 21.12 5.6.14 0.003 0.043 21.18 5.6.13 0.007 0.040 21.14 5.6.12 0.003 0.043 21.20 5.6.11 0.007 0.040 21.14 5.6.10 0.003 0.043 21.18 5.6.9 0.010 0.063 21.16 5.6.8 0.003 0.037 20.54 5.6.7 0.013 0.050 20.55 5.6.6 0.010 0.033 20.57 5.6.5 0.000 0.037 20.56 5.6.4 0.003 0.043 20.53 5.6.3 0.003 0.040 20.53 5.6.2 0.010 0.033 20.53 5.6.1 0.013 0.030 20.43 5.6.0 0.000 0.043 20.46 5.5.38 0.007 0.083 20.70 5.5.37 0.003 0.053 20.64 5.5.36 0.010 0.037 20.48 5.5.35 0.013 0.053 20.57 5.5.34 0.003 0.093 20.89 5.5.33 0.003 0.080 20.77 5.5.32 0.007 0.040 21.05 5.5.31 0.013 0.033 20.95 5.5.30 0.003 0.040 21.00 5.5.29 0.007 0.040 21.04 5.5.28 0.007 0.040 21.00 5.5.27 0.007 0.037 21.02 5.5.26 0.013 0.033 20.76 5.5.25 0.000 0.047 20.73 5.5.24 0.003 0.043 20.27 5.5.23 0.000 0.047 20.41 5.5.22 0.010 0.033 20.29 5.5.21 0.007 0.037 20.28 5.5.20 0.007 0.037 20.32 5.5.19 0.000 0.047 20.27 5.5.18 0.007 0.037 20.30 5.5.16 0.000 0.040 20.12 5.5.15 0.000 0.043 20.25 5.5.14 0.007 0.030 20.30 5.5.13 0.000 0.037 20.35 5.5.12 0.000 0.043 20.34 5.5.11 0.003 0.033 20.11 5.5.10 0.000 0.037 20.08 5.5.9 0.010 0.027 20.20 5.5.8 0.000 0.040 20.28 5.5.7 0.003 0.037 20.19 5.5.6 0.003 0.033 20.21 5.5.5 0.000 0.077 20.26 5.5.4 0.010 0.070 20.13 5.5.3 0.013 0.063 20.18 5.5.2 0.010 0.063 20.27 5.5.1 0.003 0.067 20.23 5.5.0 0.013 0.063 20.13 5.4.45 0.003 0.040 19.44 5.4.44 0.010 0.033 19.24 5.4.43 0.000 0.043 19.49 5.4.42 0.003 0.043 19.58 5.4.41 0.007 0.067 19.36 5.4.40 0.000 0.040 19.12 5.4.39 0.000 0.043 19.09 5.4.38 0.010 0.030 19.09 5.4.37 0.003 0.037 19.10 5.4.36 0.013 0.033 19.20 5.4.35 0.003 0.030 19.25 5.4.34 0.010 0.033 19.26 5.4.32 0.003 0.043 19.05 5.4.31 0.007 0.037 19.07 5.4.30 0.010 0.027 19.31 5.4.29 0.003 0.037 18.96 5.4.28 0.010 0.027 19.13 5.4.27 0.010 0.023 18.92 5.4.26 0.007 0.027 19.14 5.4.25 0.000 0.033 19.02 5.4.24 0.000 0.033 19.10 5.4.23 0.003 0.030 18.95 5.4.22 0.003 0.033 19.02 5.4.21 0.010 0.047 19.13 5.4.20 0.007 0.067 19.02 5.4.19 0.003 0.077 19.25 5.4.18 0.000 0.077 18.93 5.4.17 0.000 0.040 19.24 5.4.16 0.007 0.033 18.95 5.4.15 0.003 0.060 18.91 5.4.14 0.007 0.070 16.53 5.4.13 0.003 0.063 16.50 5.4.12 0.003 0.037 16.38 5.4.11 0.003 0.057 16.61 5.4.10 0.003 0.033 16.55 5.4.9 0.003 0.067 16.62 5.4.8 0.000 0.063 16.50 5.4.7 0.000 0.037 16.53 5.4.6 0.007 0.060 16.41 5.4.5 0.007 0.057 16.45 5.4.4 0.003 0.053 16.59 5.4.3 0.007 0.063 16.54 5.4.2 0.010 0.047 16.40 5.4.1 0.003 0.047 16.57 5.4.0 0.007 0.037 15.97 5.3.29 0.010 0.030 14.95 5.3.28 0.003 0.030 14.74 5.3.27 0.007 0.047 14.81 5.3.26 0.000 0.073 14.91 5.3.25 0.000 0.070 14.81 5.3.24 0.017 0.073 14.89 5.3.23 0.003 0.047 14.85 5.3.22 0.007 0.077 14.86 5.3.21 0.000 0.070 14.74 5.3.20 0.000 0.083 14.77 5.3.19 0.007 0.053 14.76 5.3.18 0.017 0.050 14.88 5.3.17 0.003 0.037 14.88 5.3.16 0.000 0.073 14.69 5.3.15 0.007 0.040 14.70 5.3.14 0.003 0.053 14.84 5.3.13 0.007 0.037 14.72 5.3.12 0.003 0.080 14.73 5.3.11 0.007 0.073 14.79 5.3.10 0.003 0.070 14.29 5.3.9 0.007 0.067 14.27 5.3.8 0.003 0.060 14.12 5.3.7 0.003 0.033 14.15 5.3.6 0.003 0.037 14.34 5.3.5 0.007 0.070 14.20 5.3.4 0.007 0.033 14.28 5.3.3 0.010 0.063 14.17 5.3.2 0.010 0.027 13.91 5.3.1 0.003 0.057 13.98 5.3.0 0.000 0.047 13.81
preferences:dark mode live preview
49.67 ms | 400 KiB | 5 Q