private function exportPNG($sData)
 {
     $this->getOutput()->disable();
     global $wgRequest, $wgSVGConverter, $wgSVGConverters, $wgSVGConverterPath, $IP;
     if ($wgSVGConverter == false || !isset($wgSVGConverters[$wgSVGConverter])) {
         echo wfMessage('bs-statistics-err-converter')->plain();
         return false;
     }
     $sFileName = wfTimestampNow();
     $sFileExt = '.svg';
     $oStatus = BsFileSystemHelper::saveToCacheDirectory($sFileName . $sFileExt, $sData, 'Statistics');
     if (!$oStatus->isGood()) {
         echo $oStatus->getMessage();
         return false;
     }
     $sCacheDir = $oStatus->getValue();
     $cmd = str_replace(array('$path/', '$width', '$height', '$input', '$output'), array($wgSVGConverterPath ? wfEscapeShellArg("{$wgSVGConverterPath}/") : "", intval($wgRequest->getVal('width', 600)), intval($wgRequest->getVal('height', 400)), wfEscapeShellArg($sCacheDir . '/' . $sFileName . $sFileExt), wfEscapeShellArg($sCacheDir)), $wgSVGConverters[$wgSVGConverter]) . " 2>&1";
     $err = wfShellExec($cmd);
     unlink($sCacheDir . '/' . $sFileName . $sFileExt);
     $sFileExt = '.png';
     if (!file_exists($sCacheDir . '/' . $sFileName . $sFileExt)) {
         echo $err;
         return false;
     }
     $this->getRequest()->response()->header("Content-Type:image/png");
     $this->getRequest()->response()->header("Content-Disposition:attachment; filename={$sFileName}{$sFileExt}");
     readfile($sCacheDir . '/' . $sFileName . $sFileExt);
     unlink($sCacheDir . '/' . $sFileName . $sFileExt);
     return true;
 }