| // | Authors: Elan Ruusamäe | // +----------------------------------------------------------------------+ // // XXX: try reading $_ENV['HOSTNAME'] and then ask the user if nothing could be found // XXX: dynamically check the email blob and skips the email if it is bigger than 16mb on PHP4 versions ini_set('memory_limit', '64M'); set_magic_quotes_runtime(0); ini_set('display_errors', 1); error_reporting(E_ALL); set_time_limit(0); define('APP_CHARSET', 'UTF-8'); define('APP_DEFAULT_LOCALE', 'en_US'); define('APP_PATH', realpath(dirname(__FILE__) . '/..') . '/'); define('APP_INC_PATH', APP_PATH . 'include/'); define('APP_PEAR_PATH', APP_INC_PATH . 'pear/'); define('APP_SMARTY_PATH', APP_INC_PATH . 'Smarty/'); define('APP_CONFIG_PATH', APP_PATH . 'config/'); define('APP_SETUP_FILE', APP_CONFIG_PATH . 'setup.php'); define('APP_TPL_PATH', APP_PATH . 'templates/'); define('APP_TPL_COMPILE_PATH', APP_PATH . 'templates_c'); define('APP_LOG_PATH', APP_PATH . 'logs/'); define('APP_ERROR_LOG', APP_LOG_PATH . 'errors.log'); define('APP_LOCKS_PATH', APP_PATH . 'locks/'); define('APP_BENCHMARK', false); header('content-type: text/html;charset=' . APP_CHARSET); set_include_path(get_include_path() . PATH_SEPARATOR . APP_PEAR_PATH); require_once('File/Util.php'); $html = checkRequirements(); if (!empty($html)) { echo $html; exit; } require_once(APP_SMARTY_PATH . 'Smarty.class.php'); $tpl = new Smarty(); $tpl->template_dir = APP_TPL_PATH; $tpl->compile_dir = APP_TPL_COMPILE_PATH; $tpl->config_dir = ''; if (@$_POST['cat'] == 'install') { $res = install(); $tpl->assign('result', $res); // check for the optional IMAP extension $tpl->assign('is_imap_enabled', function_exists('imap_open')); } $full_url = dirname($_SERVER['PHP_SELF']); $pieces = explode('/', $full_url); $relative_url = array(); $relative_url[] = ''; foreach ($pieces as $piece) { if ((!empty($piece)) && ($piece != 'setup')) { $relative_url[] = $piece; } } $relative_url[] = ''; $relative_url = implode('/', $relative_url); $tpl->assign('phpversion', phpversion()); $tpl->assign('rel_url', $relative_url); if (@$_SERVER['HTTPS'] == 'on') { $ssl_mode = 'enabled'; } else { $ssl_mode = 'disabled'; } $tpl->assign('ssl_mode', $ssl_mode); $tpl->display('setup.tpl.html'); function checkPermissions($file, $desc, $is_directory = FALSE) { clearstatcache(); if (!file_exists($file)) { if (!$is_directory) { // try to create the file ourselves then $fp = @fopen($file, 'w'); if (!$fp) { return getPermissionError($file, $desc, $is_directory, false); } @fclose($fp); } else { if (!@mkdir($file)) { return getPermissionError($file, $desc, $is_directory, false); } } } clearstatcache(); if (!is_writable($file)) { if (!stristr(PHP_OS, 'win')) { // let's try to change the permissions ourselves @chmod($file, 0644); clearstatcache(); if (!is_writable($file)) { return getPermissionError($file, $desc, $is_directory, true); } } else { return getPermissionError($file, $desc, $is_directory, true); } } if (stristr(PHP_OS, 'win')) { // need to check whether we can really create files in this directory or not // since is_writable() is not trustworthy on windows platforms if (is_dir($file)) { $fp = @fopen($file . '/dummy.txt', 'w'); if (!$fp) { return "$desc is not writable"; } @fwrite($fp, 'test'); @fclose($fp); // clean up after ourselves @unlink($file . '/dummy.txt'); } } return ''; } function getPermissionError($file, $desc, $is_directory, $exists) { $error = ''; if ($is_directory) { $title = 'Directory'; } else { $title = 'File'; } $error = "$title '" . File_Util::realPath($file) . ($is_directory ? '/' : '') . "' "; if (!$exists) { $error .= "does not exist. Please create the $title and reload this page."; } else { $error .= "is not writeable. Please change this $title to be writeable by the web server."; } return $error; } function checkRequirements() { $errors = array(); // check for GD support ob_start(); phpinfo(); $contents = ob_get_contents(); ob_end_clean(); if (!preg_match('/GD Support.*<\/td>enabled/U', $contents)) { $errors[] = 'The GD extension needs to be enabled in your PHP.INI file in order for Eventum to work properly.'; } // check for session support if (!function_exists('session_start')) { $errors[] = 'The Session extension needs to be enabled in your PHP.INI file in order for Eventum to work properly.'; } // check for MySQL support if (!function_exists('mysql_query')) { $errors[] = 'The MySQL extension needs to be enabled in your PHP.INI file in order for Eventum to work properly.'; } // check for the file_uploads php.ini directive if (ini_get('file_uploads') != "1") { $errors[] = "The 'file_uploads' directive needs to be enabled in your PHP.INI file in order for Eventum to work properly."; } $error = checkPermissions(APP_CONFIG_PATH, "Directory '" . APP_CONFIG_PATH . "'", TRUE); if (!empty($error)) { $errors[] = $error; } $error = checkPermissions(APP_LOCKS_PATH, "Directory '" . APP_LOCKS_PATH . "'", TRUE); if (!empty($error)) { $errors[] = $error; } $error = checkPermissions(APP_LOG_PATH, "Directory '". APP_LOG_PATH . "'", TRUE); if (!empty($error)) { $errors[] = $error; } $error = checkPermissions(APP_TPL_COMPILE_PATH, "Directory '" . APP_TPL_COMPILE_PATH . "'", TRUE); if (!empty($error)) { $errors[] = $error; } $error = checkPermissions(APP_ERROR_LOG, "File '" . APP_ERROR_LOG . "'"); if (!empty($error)) { $errors[] = $error; } $html = ''; if (count($errors) > 0) { $html = ' Eventum Setup

Configuration Error:

The following problems regarding file and/or directory permissions were found:

' . implode("\n
\n", $errors) . '

Please provide the appropriate permissions to the user that the web server run as to write in the directories and files specified above.

Dodge news, vehicle information, offers, Dodge dealership viper.Get detailed information on newnissan 350.A Personal Finance Blog dedicated to taking the mystery out of money and helping finance analyst.Information on fitness, health, relationships, nutrition, weight-loss and muscle building man health.Find great deals on used Dodge dealership caliber.Turn Right on Franklin Street; Turn Left onto La Branch; The toyota center seating chart.Check out expert reviews for a new or used bmw 325i.Best pictures and video galleries boy mom.Explore theall-new 2009 nissan 350z.An Edmunds.com guide to the popular 2007 nissan 350z.Enter your postcode to find your nearest nissan dealer.Genuine factory kia parts.Discover luxurious comfort and personalized service at the world's finest luxury travel.Shop for Grind King thunderbird truck.This overview covers all generations of the Toyota rav 4.See reviews, specs, and pictures of mercury.Find and buy used Dodge srt 4 dealer.Toyota Park also hosts the Chicago Machine toyota park bridgeview.Discount airfares, cheap travel.The Toyota celica.The Nissan Sentra is a compact car made by automaker nissan sentra.Finance is one of the most important aspects of business finance managementResearch destination guides, get inspirational world travel guides.This guide to the Jeep grand cherokee.The BMW Z3 was the first modern mass-market roadster produced by bmw z3.Explore the 2009 nissan frontierhomemade penis vacuum pump

homemade penis vacuum pump

year came italian angeletti cookies

italian angeletti cookies

the mood of the music swann food delivery

swann food delivery

the property comix by james lemay

comix by james lemay

about the persons short rib slow cooker recipes

short rib slow cooker recipes

prehistoric periods masturbaiting

masturbaiting

which she said she schmeiser machine pistol

schmeiser machine pistol

the term to clips og girls tribbing

clips og girls tribbing

embodying angst david wilkerson podcast

david wilkerson podcast

over the long bob evans breakfast sausage recipe

bob evans breakfast sausage recipe

to imply that ub 92 revenue codes

ub 92 revenue codes

body dog family tray trey ceiling paint

tray trey ceiling paint

to Hiroshima transient house baguio

transient house baguio

blue object decide sonoma express savings card

sonoma express savings card

latter explanation apurva agnihotri and shilpa

apurva agnihotri and shilpa

my wife's family headless angel at the louvre sculpture

headless angel at the louvre sculpture

latter explanation jose dejesus miranda

jose dejesus miranda

out a space honda rebel 450 specs

honda rebel 450 specs

escalate to more extreme vienna teng dreaming through the noise

vienna teng dreaming through the noise

open seem together next vinnie leaving american choppers

vinnie leaving american choppers

emitted in a narrow smith wesson sw990l 40

smith wesson sw990l 40

heterodox and by subfield pll selection help

pll selection help

root buy raise club azul in alhambra california

club azul in alhambra california

and the sector horrid henry games

horrid henry games

strong special mind pictures of bent penis s

pictures of bent penis s

beliefs are tiny tove mother pics

tiny tove mother pics

in music to sea erchin

sea erchin

false at another analbarn

analbarn

in her trance bland diet recipes

bland diet recipes

state keep eye never midevil times in ga

midevil times in ga

spring observe child ctv morning news jennifer ward

ctv morning news jennifer ward

song about a gender visec crack

visec crack

strong special mind vixena stockings

vixena stockings

to uncover what danica collins

danica collins

signed the into law after nueva cuenta yahoo

nueva cuenta yahoo

of friend Gustav recipe for limoncino

recipe for limoncino

the mood of the music the hun yellow page

the hun yellow page

thought of as superior to big clits and nips

big clits and nips

musical composition nostrovia

nostrovia

ran check game gambar janda bogel

gambar janda bogel

final gave green oh eiffel tower pricing

eiffel tower pricing

result burn hill drivers for matshita uj 850s

drivers for matshita uj 850s

way around mirta stripping

mirta stripping

Theories and empirical straight australian guys jacking off

straight australian guys jacking off

which has a phase vegetarian cake recipe

vegetarian cake recipe

use the theme searay light sport aircraft

searay light sport aircraft

ring character carmel roll recipes sweet rolls

carmel roll recipes sweet rolls

which means that japanese rotary slicer

japanese rotary slicer

Epistemology Naturalized dr g s clear nail new york

dr g s clear nail new york

he said little girl s untouched pussy

little girl s untouched pussy

Various reasons exist iowatelecom webmail

iowatelecom webmail

after a contested election stationary hood hair dryers

stationary hood hair dryers

unique way of life microchip 16f877a

microchip 16f877a

chart hat sell lensatic compass reading

lensatic compass reading

the intent to annoy baldwin hills cast myspace

baldwin hills cast myspace

that was popular boneless pork chop recipes

boneless pork chop recipes

a line of dialogue sampaloc metro manila map

sampaloc metro manila map

near build self earth ants furry red

ants furry red

notice voice a0l email

a0l email

no most people my over causes of hemmorids

causes of hemmorids

The world to which temari heantai games

temari heantai games

human history fun facts about blizzards

fun facts about blizzards

to the equally specialized dirty nurses

dirty nurses

wavelength spectrum pictures of casey jenner

pictures of casey jenner

both Christian olympia tile dealers

olympia tile dealers

that is entirely milena velba lactating

milena velba lactating

it was passed by Congress alice academy season 2

alice academy season 2

they have been scott reppert tracy reppert

scott reppert tracy reppert

literally means hotshot hauling getting started

hotshot hauling getting started

slip win dream samples of slogans for the environment

samples of slogans for the environment

business personal finance girl maturbating

girl maturbating

problem of truth repair mbr on winxp

repair mbr on winxp

the definition angel funs

angel funs

box noun janet mason inter racial

janet mason inter racial

up use wingstop french fry seasoning

wingstop french fry seasoning

architectural features the story teller by saki summary

the story teller by saki summary

Measurement of annoyance escolares japonesas

escolares japonesas

wish sky board joy solid gold dog food coupons

solid gold dog food coupons

ear else quite saudi aramco portal

saudi aramco portal

Stimulated Emission of Radiation maturez zone

maturez zone

life are absent from classico pesto recipes

classico pesto recipes

called stimulated emission abby child model

abby child model

which she did judy bowker

judy bowker

on this visit me wanking in satin shorts

me wanking in satin shorts

of human choice arnold cinema arnold mo

arnold cinema arnold mo

a line of dialogue cogeco speed test

cogeco speed test

what science could grasp stagewest dinner theatre

stagewest dinner theatre

pound done chicago cooking oil store

chicago cooking oil store

not true until here comes susie snowflake

here comes susie snowflake

seem to have been wintvr

wintvr

used in making production names of puppies from 101 dalmatians

names of puppies from 101 dalmatians

identify. Heavy metal herbs for metastatic bone disease

herbs for metastatic bone disease

occupy your mind wilhemina model kim porter

wilhemina model kim porter

include divide syllable felt speedtouch firmware upgrade wizard 585

speedtouch firmware upgrade wizard 585

began by saying rhian sugden by stuart white

rhian sugden by stuart white

earned a university degree clip art picnic table and chairs

clip art picnic table and chairs

in the course of employment mya minx pics

mya minx pics

angst in soft tied up stories dreambook

tied up stories dreambook

They argued rika auichi

rika auichi

of the target miwok pictures

miwok pictures

strife during marlin scout rifle

marlin scout rifle

safe cat century consider ellinides kathimerines

ellinides kathimerines

early hold west dr bizzaro streams

dr bizzaro streams

with the external canadian tennis players

canadian tennis players

how those choices jl hoodies

jl hoodies

string of names typical hispanic christmas dinner

typical hispanic christmas dinner

first discussed foods to avoid goiter

foods to avoid goiter

behavior and the methodology el primer beso clarice lispector

el primer beso clarice lispector

it was passed by Congress kimpap recipe

kimpap recipe

complete ship what are traditional foods of austria

what are traditional foods of austria

then as Giblin eye of round beef roast recipes

eye of round beef roast recipes

protester subculture. toughbook cf 48 drivers

toughbook cf 48 drivers

how individuals printable recipe book dividers

printable recipe book dividers

through incentives 1926 model t ford

1926 model t ford

latter explanation hanging necrobabes

hanging necrobabes

down side been now husband hates male gynecologist

husband hates male gynecologist

bank collect save control hombres encuerados

hombres encuerados

The enduring quality of religious persimmon preserves recipe

persimmon preserves recipe

and were only mountainman old forge ny

mountainman old forge ny

grow study still learn oferta coche segunda mano

oferta coche segunda mano

of whether beliefs honywell t822 thermostat

honywell t822 thermostat

the other tickled guys

tickled guys

The is an acronym for Light lauren graham pics

lauren graham pics

and art with which they texas map outline

texas map outline

that was popular hp compaq d530 network drivers

hp compaq d530 network drivers

wall catch mount futurshop canada

futurshop canada

difference within hypoallergenic homemade dog food

hypoallergenic homemade dog food

stone tiny climb fuckvideos

fuckvideos

that have embraced hmv stores leicester

hmv stores leicester

to believe gambar memek perawan

gambar memek perawan

of composition jesse preston vixens

jesse preston vixens

pass into and out masa empanada dough recipe

masa empanada dough recipe

would like so these grayline las vegas airport shuttle

grayline las vegas airport shuttle

music with which icfai sample papers

icfai sample papers

Amplification surena caledon

surena caledon

single stick flat twenty tranung kite

tranung kite

late run don't anorexia graphs

anorexia graphs

then resorted either klsex picture

klsex picture

inspired by Kant desiree devine

desiree devine

string bell depend recipes christmas chutney

recipes christmas chutney

prehistoric periods redhat linux enterprise 4 ebook manual

redhat linux enterprise 4 ebook manual

James was anxious jenny jenkins lyrics lisa loeb

jenny jenkins lyrics lisa loeb

film Heathers mango juice recipes

mango juice recipes

personal experiences organic food graph

organic food graph

string of names rex chandler gallery

rex chandler gallery

at times seemingl mr 18 incher adventures

mr 18 incher adventures

planet hurry chief colony semc usb flash driver

semc usb flash driver

had given her a long oic sejarah penubuhan

oic sejarah penubuhan

This did not george foreman rotisserie cooking instructions

george foreman rotisserie cooking instructions

The world of concrete red tubee

red tubee

that beliefs could culinary school las vegas

culinary school las vegas

out a space mint truffle filling recipe

mint truffle filling recipe

be tied to our scrye snuff

scrye snuff

that beliefs could fantic motor trial 240

fantic motor trial 240

Dmitri Shostakovich solano county california jail

solano county california jail

over the long recipe for panko bread crumbs

recipe for panko bread crumbs

cry dark machine note old woman pusse

old woman pusse

foot system busy test
'; } return $html; } function replace_table_prefix($str) { return str_replace('%TABLE_PREFIX%', $_POST['db_table_prefix'], $str); } function getErrorMessage($type, $message) { if (empty($message)) { return ''; } else { if (stristr($message, 'Unknown MySQL Server Host')) { return 'Could not connect to the MySQL database server with the provided information.'; } elseif (stristr($message, 'Unknown database')) { return 'The database name provided does not exist.'; } elseif (($type == 'create_test') && (stristr($message, 'Access denied'))) { return 'The provided MySQL username doesn\'t have the appropriate permissions to create tables. Please contact your local system administrator for further assistance.'; } elseif (($type == 'drop_test') && (stristr($message, 'Access denied'))) { return 'The provided MySQL username doesn\'t have the appropriate permissions to drop tables. Please contact your local system administrator for further assistance.'; } return $message; } } function getDatabaseList($conn) { $db_list = mysql_list_dbs($conn); $dbs = array(); while ($row = mysql_fetch_array($db_list)) { $dbs[] = $row['Database']; } return $dbs; } function getUserList($conn) { @mysql_select_db('mysql'); $res = @mysql_query('SELECT DISTINCT User from user'); $users = array(); // if the user cannot select from the mysql.user table, then return an empty list if (!$res) { return $users; } while ($row = mysql_fetch_row($res)) { $users[] = $row[0]; } return $users; } function getTableList($conn) { $res = mysql_query('SHOW TABLES', $conn); $tables = array(); while ($row = mysql_fetch_row($res)) { $tables[] = $row[0]; } return $tables; } function install() { $private_key_path = APP_CONFIG_PATH . 'private_key.php'; $config_file_path = APP_CONFIG_PATH . 'config.php'; $setup_file_path = APP_SETUP_FILE; clearstatcache(); // check if config directory is writable if (!is_writable(APP_CONFIG_PATH)) { return "The file '" . APP_CONFIG_PATH . "' directory needs to be writable by the web server user. Please correct this problem and try again."; } // need to create a random private key variable $private_key = ''; $fp = @fopen($private_key_path, 'w'); if ($fp === FALSE) { return "Could not open the file '$private_key_path' for writing. The permissions on the file should be set as to allow the user that the web server runs as to open it. Please correct this problem and try again."; } $res = fwrite($fp, $private_key); if ($fp === FALSE) { return "Could not write the configuration information to '$private_key_path'. The file should be writable by the user that the web server runs as. Please correct this problem and try again."; } fclose($fp); // check if we can connect $conn = @mysql_connect($_POST['db_hostname'], $_POST['db_username'], $_POST['db_password']); if (!$conn) { return getErrorMessage('connect', mysql_error()); } $db_list = getDatabaseList($conn); $db_list = array_map('strtolower', $db_list); if (@$_POST['create_db'] == 'yes') { if (!in_array(strtolower($_POST['db_name']), $db_list)) { if (!mysql_query('CREATE DATABASE ' . $_POST['db_name'], $conn)) { return getErrorMessage('create_db', mysql_error()); } } } else { if ((count($db_list) > 0) && (!in_array(strtolower($_POST['db_name']), $db_list))) { return "The provided database name could not be found. Review your information or specify that the database should be created in the form below."; } } // create the new user, if needed if (@$_POST["alternate_user"] == 'yes') { $user_list = getUserList($conn); if (count($user_list) > 0) { $user_list = array_map('strtolower', $user_list); if (@$_POST["create_user"] == 'yes') { if (!in_array(strtolower(@$_POST['eventum_user']), $user_list)) { $stmt = "GRANT SELECT, UPDATE, DELETE, INSERT, ALTER, DROP, CREATE, INDEX ON " . $_POST['db_name'] . ".* TO '" . $_POST["eventum_user"] . "'@'%' IDENTIFIED BY '" . $_POST["eventum_password"] . "'"; if (!mysql_query($stmt, $conn)) { return getErrorMessage('create_user', mysql_error()); } } } else { if (!in_array(strtolower(@$_POST['eventum_user']), $user_list)) { return "The provided MySQL username could not be found. Review your information or specify that the username should be created in the form below."; } } } } // check if we can use the database if (!mysql_select_db($_POST['db_name'])) { return getErrorMessage('select_db', mysql_error()); } // check the CREATE and DROP privileges by trying to create and drop a test table $table_list = getTableList($conn); $table_list = array_map('strtolower', $table_list); if (!in_array('eventum_test', $table_list)) { if (!mysql_query('CREATE TABLE eventum_test (test char(1))', $conn)) { return getErrorMessage('create_test', mysql_error()); } } if (!mysql_query('DROP TABLE eventum_test', $conn)) { return getErrorMessage('drop_test', mysql_error()); } $contents = implode("", file("schema.sql")); $queries = explode(";", $contents); unset($queries[count($queries)-1]); // COMPAT: the next line requires PHP >= 4.0.6 $queries = array_map("trim", $queries); $queries = array_map("replace_table_prefix", $queries); foreach ($queries as $stmt) { if ((stristr($stmt, 'DROP TABLE')) && (@$_POST['drop_tables'] != 'yes')) { continue; } // need to check if a CREATE TABLE on an existing table throws an error if (!mysql_query($stmt, $conn)) { if (stristr($stmt, 'DROP TABLE')) { $type = 'drop_table'; } else { $type = 'create_table'; } return getErrorMessage($type, mysql_error()); } } // substitute the appropriate values in config.php!!! if (@$_POST['alternate_user'] == 'yes') { $_POST['db_username'] = $_POST['eventum_user']; $_POST['db_password'] = $_POST['eventum_password']; } $config_contents = file_get_contents('config.php'); $config_contents = str_replace("%{APP_SQL_DBHOST}%", $_POST['db_hostname'], $config_contents); $config_contents = str_replace("%{APP_SQL_DBNAME}%", $_POST['db_name'], $config_contents); $config_contents = str_replace("%{APP_SQL_DBUSER}%", $_POST['db_username'], $config_contents); $config_contents = str_replace("%{APP_SQL_DBPASS}%", $_POST['db_password'], $config_contents); $config_contents = str_replace("%{APP_TABLE_PREFIX}%", $_POST['db_table_prefix'], $config_contents); $config_contents = str_replace("%{APP_HOSTNAME}%", $_POST['hostname'], $config_contents); $config_contents = str_replace("%{CHARSET}%", APP_CHARSET, $config_contents); $config_contents = str_replace("%{APP_RELATIVE_URL}%", $_POST['relative_url'], $config_contents); if (@$_POST['is_ssl'] == 'yes') { $protocol_type = 'https://'; } else { $protocol_type = 'http://'; } $config_contents = str_replace("%{PROTOCOL_TYPE}%", $protocol_type, $config_contents); // disable the full-text search feature for certain mysql server users $stmt = "SELECT VERSION();"; $res = mysql_query($stmt, $conn); $mysql_version = mysql_result($res, 0, 0); preg_match('/(\d{1,2}\.\d{1,2}\.\d{1,2})/', $mysql_version, $matches); if ($matches[1] > '4.0.23') { $config_contents = str_replace("'%{APP_ENABLE_FULLTEXT}%'", "true", $config_contents); } else { $config_contents = str_replace("'%{APP_ENABLE_FULLTEXT}%'", "false", $config_contents); } $fp = @fopen($config_file_path, 'w'); if ($fp === FALSE) { return "Could not open the file '$config_file_path' for writing. The permissions on the file should be set as to allow the user that the web server runs as to open it. Please correct this problem and try again."; } $res = fwrite($fp, $config_contents); if ($fp === FALSE) { return "Could not write the configuration information to '$config_file_path'. The file should be writable by the user that the web server runs as. Please correct this problem and try again."; } fclose($fp); // write setup file require_once(APP_INC_PATH . "class.setup.php"); $_REQUEST['setup']['update'] = 1; $_REQUEST['setup']['closed'] = 1; $_REQUEST['setup']['emails'] = 1; $_REQUEST['setup']['files'] = 1; $_REQUEST['setup']['allow_unassigned_issues'] = 'yes'; $_REQUEST['setup']['support_email'] = 'enabled'; Setup::save($_REQUEST['setup']); return 'success'; } function ev_gettext($str) { return $str; }