/*
Version 24.5.2004
- neue DB-Struktur => Datumsfunktionen auf Mysql-Ebene
- verstecken von get-variablen nicht implementiert
- ses_id auf korrektheit prüfen nicht implementiert
(nur in abgespeckter form: ses_id aus DB überschreibt (evtl. falsch) übergebene)
- verfallszeit in fkt zu_alt aendern!!!
*/
define('ses_id_verfaellt_nach', 240); // vier stunden
function redirect($ses_id_ref) {
$varstr=$_SERVER["QUERY_STRING"];
$rurl=$_SERVER["PHP_SELF"];
if ($varstr!="") {
if ($varstr[0]=="&") {
$rurl=$rurl."?ses_id=".$ses_id_ref.$varstr;
} else {
$rurl=$rurl."?ses_id=".$ses_id_ref."&".$varstr;
}
} else {
$rurl=$rurl."?ses_id=".$ses_id_ref;
}
header ("Location:$rurl");
exit;
// echo "
Umleitung nach $rurl
";
}
function ses_get_id_from_ref() {
$ref=$_SERVER["HTTP_REFERER"];
$rurl=parse_url($ref);
$query=$rurl[query];
$query_array = explode( "&", $query );
while (list($k, $v) = each($query_array)) {
$keyval=explode("=",$v);
if ($keyval[0]=="ses_id") {
$ses_id_ref=$keyval[1];
}
}
if ($ses_id_ref=="") {
return false;
} else {
return $ses_id_ref;
}
}
// ====================MAIN===========================
$ses_id = $_GET["ses_id"];
if (empty($ses_id)) {
// echo "Session-ID ist leer
";
$ses_id = ses_restore_id_from_eben();
if (empty($ses_id) or $ses_id==false) {
$ses_id = ses_get_id_from_ref();
if (empty($ses_id) or $ses_id==false) {
// echo"keine Session-ID im Ref
";
$ses_id = ses_make_ses_id();
// echo"Session-ID wurde neu erzeugt: $ses_id
";
// === BOTS zählen ===
$browser = browser();
$ip=getip();
$rechner = getrechner($ip);
if (ist_ein_bot($browser,$rechner)==TRUE) {
ses_db_bot_zaehlen();
/*
header ("Location:http://www.mhgta.uni-trier.de");
exit;
*/
}
} else {
// echo"Session-ID aus ref: $ses_id
";
}
} else {
// return $ses_id;
// exit;
// echo" Sie waren doch schonmal da!
";
}
redirect($ses_id);
} else {
// falsche id?
$sid = $ses_id;
$ses_id = ses_restore_id_from_eben();
if (empty($ses_id) or $ses_id==false) {
$ses_id=$sid;
}
}
// ====================================================
function ses_db_verbinden ($befehl,$db_name='session_mhgta') {
// if (empty($db_name)) $db_name = 'session_mhgta';
$db_horst = 'tares.uni-trier.de';
$db_user = 'mhgta';
$db_pwd = 'x94Z3uzJv6ChjAPn';
if ($befehl==true) {
$link = @mysql_connect($db_horst,$db_user,$db_pwd);
if (!$link) {
print("Verbindung zum MySql-Server fehlgeschlagen
");
return false;
} else {
// echo "verbunden mit $db_horst
";
}
$db_verbunden = @mysql_select_db($db_name,$link);
if (!$db_verbunden) {
print ("Verbindung zur Datenbank $db_name fehlgeschlagen
");
return false;
} else {
// echo "verbunden mit DB $db_name
";
}
return $link;
}
if ($db_verbunden){
if($befehl==false) {
mysql_close($link);
}
}
}
function ses_make_ses_id() {
srand((double)microtime()*1000000);
$ses_id = md5(uniqid(rand()));
return $ses_id;
}
function ses_on_this_script() {
$ses_id = $_GET['ses_id'];
if ($ses_id!="") {
ses_db_user($ses_id);
ses_db_seite($ses_id);
return $ses_id;
} else {
// $ses_id = ses_make_ses_id();
}
}
function ses_tabelle_erzeugen($id,$name) {
switch ($name) {
case "bot":
$sqlbefehl = "CREATE TABLE bot_zaehler (
datum DATE NOT NULL ,
anzahl BIGINT DEFAULT NULL)";
$res = mysql_query($sqlbefehl);
if ($res==1) {
return true;
} else {
return false;
}
break;
case "statistik":
$sqlbefehl = "CREATE TABLE statistik (
nr INT not null AUTO_INCREMENT,
sesid VARCHAR( 80 ) NOT NULL ,
text VARCHAR( 40 ) default NULL ,
script VARCHAR( 20 ) default NULL ,
enc VARCHAR( 8 ) default NULL ,
datum DATE NOT NULL ,
such VARCHAR( 60 ) default NULL,
PRIMARY KEY (nr), KEY (sesid), KEY (datum), UNIQUE (nr))";
$res = mysql_query($sqlbefehl);
if ($res==1) {
return true;
} else {
return false;
}
break;
case "downloads":
$sqlbefehl = "CREATE TABLE downloads (
Name varchar( 50 ) default NULL ,
Vorname varchar( 50 ) default NULL ,
Organisation varchar( 50 ) default NULL ,
Email varchar( 50 ) default NULL ,
Datum datetime default NULL ,
File varchar( 20 ) default NULL ,
IP varchar( 50 ) default NULL)";
$res = mysql_query($sqlbefehl);
// echo mysql_error();
if ($res==1) {
return true;
} else {
return false;
}
break;
case "allusers":
$sqlbefehl = "CREATE TABLE $name (
nr INT not null AUTO_INCREMENT,
sesid VARCHAR (80) not null ,
browser VARCHAR(255) not null ,
ip VARCHAR(15) not null ,
rechner VARCHAR(80) ,
referer varchar(80) default NULL ,
datum_zeit DATETIME not null ,
PRIMARY KEY (nr), UNIQUE (nr), UNIQUE(sesid))";
$res = mysql_query($sqlbefehl);
// echo mysql_error();
if ($res==1) {
return true;
} else {
return false;
}
break;
case "seiten":
$tname="ses_".$id."_".$name;
$sqlbefehl = "CREATE TABLE $tname (
nr INT not null AUTO_INCREMENT,
datum_zeit DATETIME not null ,
dateiname MEDIUMTEXT not null ,
query MEDIUMTEXT not null ,
PRIMARY KEY (nr), UNIQUE (nr))";
$res = mysql_query($sqlbefehl);
// echo mysql_error();
if ($res==1) {
return true;
} else {
return false;
}
break;
case "suche":
$tname="ses_".$id."_".$name;
$zeit = zeit();
$datum =datum();
$sqlbefehl = "CREATE TABLE $tname (
nr INT not null AUTO_INCREMENT,
suche_wf MEDIUMTEXT not null ,
suche_w MEDIUMTEXT not null ,
suche_lineid VARCHAR (20) not null ,
suche_sigle VARCHAR (10) not null ,
PRIMARY KEY (nr), UNIQUE (nr)) COMMENT='$datum;$zeit'";
$res = mysql_query($sqlbefehl);
// echo mysql_error();
if ($res==1) {
return true;
} else {
return false;
}
break;
} //ende switch
}
function datum() {
$today = date("m.d.y");
return $today;
}
function zeit() {
$today = date("H:i:s");
return $today;
}
function ses_get_text_id() {
$text = $_GET['id'];
return $text;
}
function ses_get_script() {
$datei = $_SERVER['PHP_SELF'];
$path_parts = pathinfo($datei);
$dat = $path_parts['basename'];
$scr = str_replace($path_parts['extension'],'',$dat);
if (stristr($scr,'volltext')) {
$script = 'Volltextsuche';
} elseif (stristr($scr,'frameset')) {
$script = 'Text';
} elseif (stristr($scr,'veroeff')) {
$script = 'Veröffentlichungen';
} elseif (stristr($scr,'hinweise')) {
$script = 'Hinweise';
} elseif (stristr($scr,'info')) {
$script = 'EText-Info';
} elseif (stristr($scr,'katalog')) {
$script = 'Katalog';
} elseif (stristr($scr,'down')) {
$script = 'Download';
} elseif (stristr($scr,'error')) {
$script = 'Error/Hinweis';
} else {
$script = '-none-';
}
return $script;
}
function ses_get_enc() { // ja, man hätte ein switch nehmen können
if ($_GET['enc']=='h') {
$enc = 'html';
} elseif ($_GET['enc']=='x') {
$enc = 'xml';
} elseif ($_GET['enc']=='t') {
$enc = 'tustep';
} else {
$enc = '';
}
return $enc;
}
function dateiname() {
return $_SERVER["PHP_SELF"];
}
function browser() {
return $_SERVER["HTTP_USER_AGENT"];
}
function getip() {
return $_SERVER["REMOTE_ADDR"];
}
function getrechner($ip) {
$rechner = gethostbyaddr($ip);
if ($rechner=="") {
return false;
} else {
return $rechner;
}
}
function ses_get_user($id) {
$sqlbefehl = "SELECT count(*) FROM allusers where sesid='$id' LIMIT 1";
$res = mysql_query($sqlbefehl);
if ($res) {
$row = mysql_fetch_row($res);
if ($row[0]!=0) {
return true;
} else {
return false;
}
} else {
return false;
}
}
function cmp_dat ($a, $b) {
$dat_a = explode(".",$a);
$dat_b = explode(".",$b);
if (intval($dat_a[2])intval($dat_b[2])) {
return 1;
}
if (intval($dat_a[2])==intval($dat_b[2])) {
if (intval($dat_a[0])intval($dat_b[0])) {
return 1;
}
if (intval($dat_a[2])==intval($dat_b[2])) {
if (intval($dat_a[1])intval($dat_b[1])) {
return 1;
}
if (intval($dat_a[1])==intval($dat_b[1])) {
return 0;
}
}
}
}
function cmp_tim ($a, $b) {
$dat_a = explode(":",$a);
$dat_b = explode(":",$b);
$min = intval($dat_a[1]);
$all=$ses_id_verfaellt_nach+$min;
$stdn = intval($all/60);
$rest = intval($all%60);
$dat_a[0]=$dat_a[0]+$stdn;
$dat_a[1]=$dat_a[1]+$rest;
if (intval($dat_a[0])intval($dat_b[0])) {
return 1;
}
if (intval($dat_a[0])==intval($dat_b[0])) {
if (intval($dat_a[1])intval($dat_b[1])) {
return 1;
}
if (intval($dat_a[1])==intval($dat_b[1])) {
if (intval($dat_a[2])intval($dat_b[2])) {
return 1;
}
if (intval($dat_a[2])==intval($dat_b[2])) {
return 0;
}
}
}
}
function ses_aelter_als ($time,$date) {
$dat_now=datum();
$tim_now=zeit();
// echo"$date - $dat_now
";
// echo"$time - $tim_now
";
if (cmp_dat($date,$dat_now)==-1) {
return true;
exit;
}
if (cmp_dat($date,$dat_now)==1) {
return false;
exit;
}
if (cmp_dat($date,$dat_now)==0) {
if (cmp_tim($time,$tim_now)==-1) {
return true;
exit;
}
if (cmp_tim($time,$tim_now)==1) {
return false;
exit;
}
if (cmp_tim($time,$tim_now)==0) {
return false;
exit;
}
}
}
function ses_get_sesid_by_rechner_db($rechner) {
if (ses_table_exists("allusers")) {
$sqlbefehl = "SELECT * FROM allusers where rechner='$rechner' ORDER BY nr DESC;";
$res = mysql_query($sqlbefehl);
$num = mysql_num_rows ($res);
if ($num==0) {
return false;
exit;
} else {
$row = mysql_fetch_row($res);
return $row;
}
} else {
return false;
}
}
function ses_get_time_by_sesid_db($sesid) {
$tname = "ses_".$sesid."_seiten";
// echo"$tname
";
$sqlbefehl="SELECT zeit FROM $tname ORDER BY nr DESC;";
$res = mysql_query($sqlbefehl);
if ($res) {
$num = mysql_num_rows($res);
if ($num>=1) {
return mysql_result($res,0,"zeit");
} else {
return false;
}
} else {
return false;
}
}
function ses_get_date_by_sesid_db($sesid) {
$tname = "ses_".$sesid."_seiten";
$sqlbefehl="SELECT datum FROM $tname ORDER BY nr DESC;";
$res = mysql_query($sqlbefehl);
if ($res) {
$num = mysql_num_rows($res);
if ($num>=1) {
return mysql_result($res,0,"datum");
} else {
return false;
}
} else {
return false;
}
}
function zu_alt($sesid) {
$tname = "ses_".$sesid."_seiten";
if (ses_table_exists($tname)) {
// jaja, möglichst maschinennah. ich kanns halt nicht in
// effizient guter zeit... deswegen so:
$sqlbefehl="SELECT UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 240 MINUTE))";
$res = mysql_query($sqlbefehl);
if ($res) {
$row1 = mysql_fetch_row($res);
}
$sqlbefehl="SELECT UNIX_TIMESTAMP(datum_zeit) FROM $tname ORDER BY nr DESC LIMIT 1";
$res = mysql_query($sqlbefehl);
if ($res) {
$row2 = mysql_fetch_row($res);
}
if ($row1[0]<$row2[0]) {
return false;
} else {
return true;
}
} else {
$sqlbefehl="SELECT UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 240 MINUTE))";
$res = mysql_query($sqlbefehl);
if ($res) {
$row1 = mysql_fetch_row($res);
}
$tname = "allusers";
$ip = getip();
if (ses_table_exists($tname)) {
$sqlbefehl="SELECT UNIX_TIMESTAMP(datum_zeit) FROM $tname WHERE ip='$ip' ORDER BY nr DESC LIMIT 1";
// echo"$sqlbefehl
";
$res = mysql_query($sqlbefehl);
if ($res) {
$row2 = mysql_fetch_row($res);
}
if ($row1[0]<$row2[0]) {
return false;
} else {
return true;
}
} else {
return true;
}
}
}
function ses_get_last_sesid_by_ip_db($ip) {
if (ses_table_exists("allusers")) {
$sqlbefehl = "SELECT sesid FROM allusers where ip='$ip' ORDER BY nr DESC";
$res = mysql_query($sqlbefehl);
if ($res) {
$row = mysql_fetch_row($res);
return $row[0];
} else {
return false;
}
} else {
return false;
}
}
function ses_restore_id_from_eben() {
// echo"trying to restore Session-ID
";
$ip=getip();
// echo"$ip
";
$rechner = getrechner($ip);
// echo"$rechner
";
if (!empty($ip)) {
ses_db_verbinden(true);
$id = ses_get_last_sesid_by_ip_db($ip);
// echo" alte id: $id";
ses_db_verbinden(false);
if (!empty($id)) {
$zualt = zu_alt($id);
// echo"alt: --$zualt--";
if ($zualt) {
$id="";
return $id;
} else {
return $id;
}
} else {
$id="";
return $id;
}
} else {
return false;
}
}
function ses_get_query_without_id() {
$query=$_SERVER["QUERY_STRING"];
$query_array = explode( "&", $query);
while (list($k, $v) = each($query_array)) {
$keyval=explode("=",$v);
if ($keyval[0]=="ses_id") {
// $ses_id_ref=$keyval[1];
} else {
$new_query.="&".$keyval[0]."=".$keyval[1];
}
}
if ($new_query!="") {
if ($new_query[0]=="&") {
$new_query[0]=" ";
$new_query=trim($new_query);
}
// echo"$new_query";
return $new_query;
} else {
false;
}
}
function ist_ein_bot($br,$re) {
$foo = array('find','bot','search','crawl','spider','google','fireball','lycos','eule','northernlight','aladin');
$ist = false;
foreach ($foo as $v) {
if (stristr($br,$v) or stristr($re,$v)) {
$ist = true;
}
}
return $ist;
}
function ses_bot_tabelle_fuellen() {
$sqlbefehl="UPDATE bot_zaehler SET anzahl=anzahl+1
WHERE YEAR(datum)=YEAR(NOW())
AND MONTH(datum)=MONTH(NOW())";
$res = mysql_query($sqlbefehl)
or die ("Fehler bei MySQL (bei BoT Tabelle update): " . mysql_error());
if (mysql_affected_rows()==0) {
$sqlbefehl="INSERT INTO bot_zaehler SET datum=NOW(), anzahl=1";
$res = mysql_query($sqlbefehl)
or die ("Fehler bei MySQL (bei BoT Tabelle füllen): " . mysql_error());
}
if ($res=="1") {
return false;
} else {
return true;
}
mysql_free_result($res);
}
function ses_tabelle_fuellen($id,$name) {
if ($name=="allusers") {
$ref = $_SERVER["HTTP_REFERER"];
$browser = browser();
$ip=getip();
$rechner = getrechner($ip);
if (ist_ein_bot($browser,$rechner)!=true) {
$sqlbefehl="INSERT INTO $name (
nr, sesid, browser, ip, rechner, referer, datum_zeit)
VALUES ('', '$id', '$browser','$ip','$rechner', '$ref', NOW())";
$res = mysql_query($sqlbefehl)
or die ("Fehler bei MySQL (bei Tabelle füllen user): " . mysql_error());
if ($res=="1") {
return false;
} else {
// echo "User angelegt: $sqlbefehl
";
return true;
}
mysql_free_result($res);
}
} elseif ($name=="seiten") {
$tname = "ses_".$id."_".$name;
$query = ses_get_query_without_id();
$dateiname=dateiname();
$sqlbefehl="INSERT INTO $tname (
nr, datum_zeit, dateiname, query)
VALUES ('', NOW(), '$dateiname','$query');";
$res = mysql_query($sqlbefehl)
or die ("Fehler bei MySQL (bei Tabelle füllen seite): " . mysql_error());
if ($res=="1") {
return false;
} else {
return true;
}
mysql_free_result($res);
} elseif ($name=='statistik') {
$tname = 'statistik';
$script = ses_get_script();
$text = ses_get_text_id();
$such = rawurldecode($_GET['suchwort']);
$enc = ses_get_enc();
$browser = browser();
$ip=getip();
$rechner = getrechner($ip);
if (ist_ein_bot($browser,$rechner)!=true) {
$sqlbefehl="INSERT INTO $tname (
sesid, text, script, enc, datum, such)
VALUES ('$id', '$text', '$script', '$enc', NOW(), '$such');";
$res = mysql_query($sqlbefehl)
or die ("Fehler bei MySQL (bei Tabelle füllen statistik): " . mysql_error());
if ($res=="1") {
return false;
} else {
return true;
mysql_free_result($res);
}
}
} else {
return false;
}
}
function ses_tabelle_loeschen($id,$name) {
if ($name=="allusers") {
$sqlbefehl="DROP TABLE $name;";
$res = mysql_query($sqlbefehl)
or die ("Fehler bei MySQL: " . mysql_error());
if ($res=="1") {
return false;
} else {
return true;
}
} else {
$tname = "ses_".$id."_".$name;
$sqlbefehl="DROP TABLE $tname;";
$res = mysql_query($sqlbefehl)
or die ("Fehler bei MySQL: " . mysql_error());
if ($res=="1") {
return false;
} else {
return true;
}
}
}
function ses_table_exists($t_name) {
$result = mysql_list_tables("session_mhgta");
if (!$result) {
print "DB Fehler, Tabellen können nicht angezeigt werden\n";
print 'MySQL Fehler: ' . mysql_error();
exit;
}
$exists = false;
while ($row = mysql_fetch_row($result)) {
if ($row[0]=="$t_name") {
$exists=true;
}
}
mysql_free_result($result);
return $exists;
}
function ses_db_seite($sesid) {
$link = ses_db_verbinden(true);
$name = "ses_".$sesid."_seiten";
if (ses_table_exists($name)) {
ses_tabelle_fuellen($sesid,"seiten");
return true;
} else {
if (ses_tabelle_erzeugen($sesid,"seiten")) {
ses_tabelle_fuellen($sesid,"seiten");
return true;
} else {
return false;
}
}
$link = ses_db_verbinden(false);
}
function ses_db_suche_get_einzeltreffer($sesid,$von,$anz) {
$link = ses_db_verbinden(true);
$name = "ses_".$sesid."_suche";
$von=$von-1;
if (ses_table_exists($name)) {
$sqlbefehl = "SELECT suche_sigle,suche_wf,count(suche_wf) FROM $name group by suche_wf order by suche_wf LIMIT $von,$anz;";
// echo"$sqlbefehl
";
$res = mysql_query($sqlbefehl);
$num = mysql_num_rows ($res);
if ($num==0) {
return false;
} else {
for ($i=0;$i<$num;$i++) {
$wortform = mysql_result($res,$i,"suche_wf");
$treffer = mysql_result($res,$i,"count(suche_wf)");
$fundstellen[$i] =
array("wf"=>"$wortform","treffer"=>"$treffer");
}
return $fundstellen;
}
} else {
// echo" keine tabelle
";
return false;
}
$link = ses_db_verbinden(false);
}
function ses_db_suche_get_trefferanzahl($sesid,$alle,$sw) {
$treffer=0;
$link = ses_db_verbinden(true);
// echo"$link";
$name = "ses_".$sesid."_suche";
if (ses_table_exists($name)) {
if ($alle==false) {
// sleep(1);
$sqlbefehl = "SELECT COUNT(suche_wf) FROM $name group by suche_wf;";
// echo"$sqlbefehl";
$res = mysql_query($sqlbefehl);
$treffer = mysql_num_rows ($res);
} else {
$sqlbefehl = "SELECT COUNT(suche_wf) FROM $name where suche_wf LIKE '$sw';";
$res = mysql_query($sqlbefehl);
$treffer = mysql_result($res,0,"count(suche_wf)");
}
}
$link = ses_db_verbinden(false);
return $treffer;
}
function ses_db_suche_get_mehrfachtreffer($sesid,$suchwort,$von,$anz) {
$link = ses_db_verbinden(true);
$name = "ses_".$sesid."_suche";
$von=$von-1;
for ($l=0;$l";
$res = mysql_query($sqlbefehl);
$num = mysql_num_rows ($res);
if ($num==0) {
// return false;
} else {
for ($i=0;$i<$num;$i++) {
$wortform = mysql_result($res,$i,"suche_wf");
$wort = mysql_result($res,$i,"suche_w");
$lineid = mysql_result($res,$i,"suche_lineid");
$sigle = mysql_result($res,$i,"suche_sigle");
$fundstellen[] =
array("wf"=>"$wortform", "lineid" =>"$lineid", "sigle" => "$sigle", "wort" => "$wort");
}
}
return $fundstellen;
} else {
return false;
}
$link = ses_db_verbinden(false);
}
function ses_db_user($sesid) {
$link = ses_db_verbinden(true);
$name = "allusers";
if (ses_table_exists($name)) {
// echo"Benutzertabelle gefunden
";
if (ses_get_user($sesid)==false) {
ses_tabelle_fuellen($sesid,"allusers");
return true;
}
} else {
// echo"Benutzertabelle nicht gefunden
";
if (ses_tabelle_erzeugen($sesid,"allusers")) {
// echo"Benutzertabelle erzeugt
";
if (ses_get_user($sesid)==false) {
ses_tabelle_fuellen($sesid,"allusers");
return true;
}
} else {
// echo"Benutzertabelle nicht erzeugt
";
return false;
}
}
$link = ses_db_verbinden(false);
}
/*
function ses_stat_get_tabname() {
$link = ses_db_verbinden(true);
$sqlbefehl = "SELECT DATE_FORMAT(NOW(), CONCAT(ELT(MONTH(NOW()),'Januar','Februar','März','April','Mai','Juni','Juli','August','September','Oktober','November','Dezember'),'_%Y'))";
$res = mysql_query($sqlbefehl);
$row = mysql_fetch_row($res);
$name = $row[0];
mysql_free_result($res);
if (!empty($name)) {
return $name;
} else {
return false;
}
$link = ses_db_verbinden(false);
}
*/
function ses_db_stat($sesid,$stat=FALSE) {
$link = ses_db_verbinden(true);
$name = 'statistik';
if ($stat==FALSE) $stat = $_GET['stat'];
if (ses_table_exists($name)) {
if ($stat==TRUE) {
ses_tabelle_fuellen($sesid,'statistik');
}
} else {
if (ses_tabelle_erzeugen($sesid,'statistik')) {
if ($stat==TRUE) {
ses_tabelle_fuellen($sesid,'statistik');
}
return true;
} else {
return false;
}
}
$link = ses_db_verbinden(false);
}
function ses_db_bot_zaehlen() {
$link = ses_db_verbinden(true);
$name = 'bot_zaehler';
if (ses_table_exists($name)) {
ses_bot_tabelle_fuellen();
} else {
if (ses_tabelle_erzeugen($sesid,'bot')) {
ses_bot_tabelle_fuellen();
return true;
} else {
return false;
}
}
$link = ses_db_verbinden(false);
}
?>