<?php
header('Content-Type: text/html; charset=UTF-8');
ini_set('display_errors',        1);
ini_set('display_startup_errors',1);
error_reporting(E_ALL);
session_start();
// ─── Force all dates/times into Eastern Time ──────────────────────────
date_default_timezone_set('America/New_York');

// ─── Helpers ───────────────────────────────────────────────────────────────
function get_geolocation(string $ip): string {
    static $cache = [];
    if (isset($cache[$ip])) return $cache[$ip];

    $dir = __DIR__ . '/geo_cache';
    if (!is_dir($dir)) mkdir($dir, 0755, true);
    $file = "$dir/{$ip}.json";

    if (file_exists($file) && time() - filemtime($file) < 86400) {
        $raw = file_get_contents($file);
    } else {
        $ch = curl_init("http://ip-api.com/json/$ip?fields=status,city,regionName,country,countryCode");
        curl_setopt_array($ch, [
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_CONNECTTIMEOUT => 2,
            CURLOPT_TIMEOUT        => 3,
        ]);
        $raw = curl_exec($ch);
        curl_close($ch);
        if ($raw !== false) file_put_contents($file, $raw);
    }

    if ($raw) {
        $data = json_decode($raw, true);
        if (!empty($data['status']) && $data['status'] === 'success') {
            $loc = "{$data['city']}, {$data['regionName']}, {$data['country']} {$data['countryCode']}";
            return $cache[$ip] = $loc;
        }
    }
    return $cache[$ip] = 'Location Not Found';
}

function log_action(string $action): void {
    // Visitor + user
    $visitor_id = $_COOKIE['visitor_id'] ?? 'unknown';
    $user       = $_SESSION['username']   ?? 'guest';
    $visitor    = "{$visitor_id} (Username: {$user})";

    // IP & raw geo
    $ip      = $_SERVER['REMOTE_ADDR'] ?? 'unknown';
    $geoRaw  = get_geolocation($ip);  // e.g. "Newark, New Jersey, United States US"

// inside foreach($lines as $line) after list($vid,$ip,$ua,$geo,$act,$time):
if (preg_match('/^(.+), ([^,]+), (.+) ([A-Z]{2})$/', $geo, $m)) {
    $city        = $m[1];
    $state       = $m[2];
    $countryName = $m[3];
    $cc          = $m[4];

    // Build a Twemoji SVG <img> for this code:
    $base       = 0x1F1E6;
    $hex1       = dechex($base + (ord($cc[0]) - ord('A')));
    $hex2       = dechex($base + (ord($cc[1]) - ord('A')));
    $twemojiUrl = "https://twemoji.maxcdn.com/v/latest/svg/{$hex1}-{$hex2}.svg";
    $flagImg    = "<img src=\"{$twemojiUrl}\" alt=\"{$cc}\""
                . " style=\"width:1em;height:1em;vertical-align:middle;margin-right:4px;\">";

    $iploc = "{$flagImg}{$ip} &ndash; {$city}, {$state}, {$countryName}";
} else {
    $iploc = $ip;
}

$formattedLogs[] = [
    'visitor_id'  => htmlspecialchars($vid),
    'ip_location' => $iploc,           // now contains raw <img> HTML
    'browser'     => htmlspecialchars($br),
    'action'      => htmlspecialchars($act),
    'timestamp'   => htmlspecialchars($time),
];



    // User-agent (for browser parsing later)
    $ua   = $_SERVER['HTTP_USER_AGENT'] ?? 'unknown';

    // Timestamp
    $time = date('Y-m-d H:i:s');

    // Build a pipe-delimited log line
    $line = implode(' | ', [
        $visitor,
        $ip,
        $ua,
        $loc,
        $action,
        $time,
    ]) . "\n";

    file_put_contents(__DIR__ . '/logs.txt', $line, FILE_APPEND|LOCK_EX);
}
// ─── Read & Parse Logs ─────────────────────────────────────────────
$raw   = file_get_contents(__DIR__ . '/logs.txt');
$lines = preg_split('/\r?\n/', $raw, -1, PREG_SPLIT_NO_EMPTY);

$formattedLogs = [];
foreach ($lines as $line) {
    // split into exactly 6 fields
    list($vid, $ip, $ua, $geo, $act, $time) = array_map('trim', explode(' | ', $line, 6));

    // now you can safely refer to $vid, $geo, etc.
    // 1) truncate the visitor ID
    $shortId = substr($vid, 0, 6);
    $vid     = "{$shortId}… " . strstr($vid, '(Username:');

    // 2) parse the browser/OS
    $uai = parseUserAgent($ua);
    $br  = "{$uai['browser']} on {$uai['os']}";

    // 3) build your flag + location string
    if (preg_match('/^(.+), ([^,]+), (.+) ([A-Z]{2})$/', $geo, $m)) {
        [$all, $city, $state, $countryName, $cc] = $m;
        $base   = 0x1F1E6;
        $hex1   = dechex($base + (ord($cc[0]) - ord('A')));
        $hex2   = dechex($base + (ord($cc[1]) - ord('A')));
        $svgUrl = "https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/svg/{$hex1}-{$hex2}.svg";
        $flag   = "<img src=\"{$svgUrl}\" alt=\"{$cc}\" style=\"width:1em;height:1em;vertical-align:middle;margin-right:4px;\">";
        $iploc  = "{$flag}{$ip} &ndash; {$city}, {$state}, {$countryName}";
    } else {
        $iploc = $ip;
    }

    $formattedLogs[] = [
        'visitor_id'  => htmlspecialchars($vid),
        'ip_location' => $iploc,            // no htmlspecialchars!
        'browser'     => htmlspecialchars($br),
        'action'      => htmlspecialchars($act),
        'timestamp'   => htmlspecialchars($time),
    ];
}

// Sort newest-first
// NEW – compatible with PHP 7.3 and earlier
usort($formattedLogs, function(array $a, array $b): int {
    return strtotime($b['timestamp']) <=> strtotime($a['timestamp']);
});



/**
 * Turn a 2-letter ISO country code into 🇦🇺 style flag emoji.
 */
function getFlagEmoji(string $code): string {
    // Make sure it’s uppercase A–Z
    $code = strtoupper(substr($code, 0, 2));

    // Regional Indicator Symbol Letter A starts at U+1F1E6
    $base = 0x1F1E6;

    // If mb_chr isn’t available, fall back to plain code
    if (!function_exists('mb_chr')) {
        return $code;
    }

    // Compute each Regional Indicator codepoint
    $firstCp  = $base + (ord($code[0]) - ord('A'));
    $secondCp = $base + (ord($code[1]) - ord('A'));

    // mb_chr will produce a proper UTF-8 character
    return mb_chr($firstCp, 'UTF-8') . mb_chr($secondCp, 'UTF-8');
}




function parseUserAgent(string $ua): array {
    if (strpos($ua,'OPR/')!==false||strpos($ua,'Opera')!==false)    $b='Opera';
    elseif(strpos($ua,'Edg/')!==false)                              $b='Edge';
    elseif(strpos($ua,'Chrome/')!==false)                           $b='Chrome';
    elseif(strpos($ua,'Safari/')!==false&&strpos($ua,'Chrome/')===false) $b='Safari';
    elseif(strpos($ua,'Firefox/')!==false)                          $b='Firefox';
    else                                                             $b='Unknown';

    if      (preg_match('/Windows NT 10\.0;.*Windows 11/',$ua))      $o='Windows 11';
    elseif (preg_match('/Windows NT 10\.0/',$ua))                    $o='Windows 10';
    elseif (preg_match('/Windows NT 6\.[123]/',$ua))                 $o='Windows 7/8';
    elseif (strpos($ua,'Macintosh')!==false)                         $o='macOS';
    elseif (strpos($ua,'iPhone')!==false)                            $o='iPhone';
    elseif (strpos($ua,'iPad')!==false)                              $o='iPad';
    elseif (strpos($ua,'Android')!==false)                           $o='Android';
    elseif (strpos($ua,'Linux')!==false)                             $o='Linux';
    else                                                             $o='Unknown';

    return ['browser'=>$b,'os'=>$o];
}

$stored_hash = '$6$65jYHF9t$7uyBGjwv.lcnSDAmSFOy1JejWRAuY74nJECPII/hMO/J5l822c5.XZ/syQLNVM3lF8.SF6Hy6ArISw72uwfYh0';

// ─── Logout ────────────────────────────────────────────────────────────────
if (isset($_GET['logout'])) {
    log_action('Logout from Admin Page (admin.php)');
    session_destroy();
    header('Location: admin.php');
    exit;
}

// ─── Authentication ─────────────────────────────────────────────────────────
if (empty($_SESSION['admin_auth'])) {
    log_action('Visited Admin Page (admin.php)');
    $error = '';
    if ($_SERVER['REQUEST_METHOD']==='POST' && isset($_POST['password'])) {
        if (crypt($_POST['password'],$stored_hash) === $stored_hash) {
            $_SESSION['admin_auth'] = true;
            log_action('Login to Admin Page (admin.php)');
            header('Location: admin.php');
            exit;
        } else {
            $error = 'Invalid password.';
        }
    }
    echo <<<HTML
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Admin Login</title>
<style>body{font-family:Arial,sans-serif;background:#f0f0f0;text-align:center;padding-top:100px;}form{display:inline-block;background:#fff;padding:20px;border-radius:8px;box-shadow:0 2px 8px rgba(0,0,0,0.1);}input[type=password]{padding:8px;width:200px;margin-bottom:10px;}button{padding:8px 16px;}.error{color:red;margin-bottom:10px;}</style>
</head><body><h1>Admin Login</h1><form method="POST"><div class="error">{$error}</div><input type="password" name="password" placeholder="Password" required autofocus><br><button type="submit">Log In</button></form></body></html>
HTML;
    exit;
}

// ─── Clear Logs ─────────────────────────────────────────────────────────────
if (isset($_GET['clearlogs'])) {
    file_put_contents(__DIR__ . '/logs.txt', '');
    echo json_encode(['status'=>'success']);
    exit;
}
// ─── Handle “Clear Error Logs” BEFORE any HTML output ───────────────────────────
if (isset($_GET['clearerrors'])) {
    @file_put_contents(__DIR__ . '/error.log', '');
    echo json_encode(['status'=>'success']);
    exit;
}

// ─── Photo Deletion ──────────────────────────────────────────────────────────
if (isset($_GET['delete'])) {
    $file = basename($_GET['delete']);
    $path = __DIR__ . '/uploads/' . $file;
    if (is_file($path) && unlink($path)) {
        log_action("Deleted photo $file");
        echo json_encode(['status'=>'success']);
    } else {
        echo json_encode(['status'=>'failure']);
    }
    exit;
}

// ─── VirusTotal Integration ──────────────────────────────────────────────────
$virusTotalApiKey = '78e2de724beffa237867f5125b113a7aed68e08391e40d9c7bf3072f841d175d';
function scanWithVirusTotal(string $path): ?string {
    global $virusTotalApiKey;
    $file = curl_file_create($path);
    $ch = curl_init('https://www.virustotal.com/api/v3/files');
    curl_setopt_array($ch, [
        CURLOPT_HTTPHEADER    => ["x-apikey: {$virusTotalApiKey}"],
        CURLOPT_RETURNTRANSFER=> true,
        CURLOPT_POST          => true,
        CURLOPT_POSTFIELDS    => ['file'=>$file],
    ]);
    $resp = curl_exec($ch);
    curl_close($ch);
    if (!$resp) return null;
    $data = json_decode($resp,true);
    return $data['data']['id'] ?? null;
}

function getVirusTotalReport(string $id): ?string {
    global $virusTotalApiKey;
    $ch = curl_init("https://www.virustotal.com/api/v3/analyses/$id");
    curl_setopt_array($ch, [
        CURLOPT_HTTPHEADER    => ["x-apikey: {$virusTotalApiKey}"],
        CURLOPT_RETURNTRANSFER=> true,
    ]);
    $resp = curl_exec($ch);
    curl_close($ch);
    $data = json_decode($resp,true);
    return $data['meta']['file_info']['sha256'] ?? null;
}

// ─── Gallery Upload ─────────────────────────────────────────────────────────
$uploadMessage = '';
if (isset($_POST['upload_image'])) {
    if (!isset($_FILES['fileToUpload']) || $_FILES['fileToUpload']['error']!==UPLOAD_ERR_OK) {
        $uploadMessage = '<p style="color:red;">Upload error ('.$_FILES['fileToUpload']['error'].').</p>';
    } else {
        $name = basename($_FILES['fileToUpload']['name']);
        $tmp  = $_FILES['fileToUpload']['tmp_name'];
        $dest = __DIR__ . '/uploads/' . $name;
        $aid  = scanWithVirusTotal($tmp);
        if (!$aid) {
            $uploadMessage = '<p style="color:red;">VT scan failed. <a href="https://www.virustotal.com/gui/home/upload" target="_blank">Manual scan</a>.</p>';
        } else {
            $hash=null;
            for($i=0;$i<5;$i++){sleep(2); if($h=getVirusTotalReport($aid)){ $hash=$h; break; }}
            if (!$hash) {
                $uploadMessage = '<p style="color:red;">VT report unavailable.</p>';
            } elseif (move_uploaded_file($tmp,$dest)) {
                log_action("Uploaded photo $name");
                $link = "https://www.virustotal.com/gui/file/{$hash}";
                $uploadMessage = "<p style='color:green;'>Uploaded <strong>{$name}</strong>. <a href='{$link}' target='_blank'>View VT report</a></p>";
            } else {
                $uploadMessage = '<p style="color:red;">Failed to save file.</p>';
            }
        }
    }
}



?>
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Admin Panel</title>
  <!-- Twemoji library: leave this here so it’s loaded before the body -->
 <!-- <script src="https://twemoji.maxcdn.com/v/latest/twemoji.min.js" crossorigin="anonymous"></script>-->

<style>body{font-family:Arial,sans-serif;background:#f0f0f0;margin:20px;}h1{text-align:center;}.tabs{text-align:center;margin-bottom:20px;}.../*rest of your CSS*/
/* Put this in your <head> inside <style> */
td.ip-location {
  font-family:
    "Segoe UI Emoji",       /* Windows color emoji */
    "Apple Color Emoji",    /* macOS/iOS color emoji */
    "Noto Color Emoji",     /* Android/Linux if installed */
    "Segoe UI Symbol",      /* fallback symbol font */
    Arial,                  /* your normal text font */
    sans-serif;             /* system sans fallback */
}

</style>
</head>
<body>
<h1>
  <img
    src="/favicon.png"
    width="96"
    height="96"
    style="vertical-align: middle; margin-right: 0px;"
  >
  Admin Panel
    <img
    src="/favicon.png"
    width="96"
    height="96"
    style="vertical-align: middle; margin-left: 0px;"
	>
</h1>
  <style>
    body { font-family: Arial, sans-serif; background: #f0f0f0; margin: 20px; }
    h1 { text-align: center; }
    .tabs { text-align: center; margin-bottom: 20px; }
	.tabs a {
  /* make them inline-block (so padding works) and kill the default underline */
  display: inline-block;
  text-decoration: none;

  /* match your button styles: */
  margin: 5px;
  padding: 10px 20px;
  background: #3498db;
  color: #fff;
  border: none;
  border-radius: 6px;
  cursor: pointer;
}

.tabs a:hover {
  background: #2980b9;
}

    .tabs button, .tabs a { margin: 5px; padding: 10px 20px; background: #3498db; color: #fff; border: none; border-radius: 6px; cursor: pointer; }
    .tabs button:hover, .tabs a:hover { background: #2980b9; }
    .hidden { display: none; }
<>
  table, th, td {
    /* fall back to a color-emoji font when needed */
    font-family:
      Arial, 
      sans-serif, 
      "Segoe UI Emoji",
      "Apple Color Emoji",
      "Noto Color Emoji",
      "Segoe UI Symbol";
  }
  th, td {
    padding: 8px;
    border: 1px solid #ccc;
    text-align: center;
  }

    img { max-width: 120px; border-radius: 8px; }
    input[type="text"] { padding: 6px; width: 200px; }
	#logsTable {
  margin: 0 auto;      /* shorthand for margin-top/bottom = 0; left/right = auto */
  /* optional: set a max-width so it doesn’t stretch too wide */
  max-width: 90%;      
}
  </style>

<div class="tabs">
  <a href="https://bp.adampowell.pro/">🏠 Home</a>
  <button onclick="showTab('gallery')">🖼️ Gallery</button>
  <button onclick="showTab('logs')">📜 Visitor Logs</button>
    <button onclick="showTab('errors')">❗ Error Logs</button>

  <a href="admin.php?logout=1">🚪 Logout</a>
</div>
<!-- ─── Gallery Section ───────────────────────────────────────────────────────── -->
<div id="gallery" class="hidden">
<center>
  <h2>Gallery & Upload</h2>
  <?php 
  if (!empty($uploadMessage)) {
echo $uploadMessage;
// ensure URL hash is set so reload stays on Gallery
echo "<script>location.hash = 'gallery';</script>";

  }
?>

<form id="adminUploadForm" enctype="multipart/form-data" method="POST">
  <input type="file" name="fileToUpload" required>
  <button type="submit" name="upload_image">Upload New Photo</button>
</form>

  <progress id="adminUploadProgress" value="0" max="100" style="display:none;"></progress>
  <p id="adminUploadStatus"></p>

<!-- in your Gallery section -->
<h3>Existing Photos</h3>
<div style="text-align:center;margin-bottom:10px">
  <!-- set the hash, then reload -->
  <button
    onclick="location.hash = 'gallery'; location.reload();"
  >🔄 Refresh</button>
  <button onclick="location='admin.php?sort=desc#gallery'">Newest First</button>
  <button onclick="location='admin.php?sort=asc#gallery'">Oldest First</button>
</div>

  <table>
    <tr><th>Thumb</th><th>Filename</th><th>Action</th></tr>
    <?php
    $files = [];
    foreach (scandir(__DIR__ . '/uploads/') as $f) {
        $p = __DIR__ . "/uploads/$f";
        if (is_file($p) && in_array(strtolower(pathinfo($f, PATHINFO_EXTENSION)), ['jpg','jpeg','png','gif'])) {
            $files[$f] = filemtime($p);
        }
    }
    $sort = $_GET['sort'] ?? 'desc';
    $sort === 'asc' ? asort($files) : arsort($files);
    if (empty($files)) {
        echo "<tr><td colspan='3'>No photos uploaded.</td></tr>";
    } else {
        foreach ($files as $f => $_) {
            echo "<tr class='photo-item'>
                    <td><img src='uploads/".htmlspecialchars($f)."'></td>
                    <td>".htmlspecialchars($f)."</td>
                    <td><button class='delete-btn' data-file='".htmlspecialchars($f)."'>Delete</button></td>
                  </tr>";
        }
    }
    ?>
  </table>
</div>
</center>
</div>
<!-- Visitor Logs Section -->
<div id="logs" class="hidden">
  <center><h2>Visitor Logs</h2></center>
  <!-- … your buttons/search bar here … -->
  <div style="text-align:center; margin-bottom:10px">
      <button onclick="location.reload()">🔄 Refresh Logs</button>

    <button onclick="sortLogs(true)">🆕 Newest First</button>
    <button onclick="sortLogs(false)">📜 Oldest First</button>
    <input type="text" id="logSearch" onkeyup="filterLogs()" placeholder="🔎 Search logs…">
    <button id="clearLogsBtn" style="background:#f39c12;">Clear Logs</button>
  </div>
  <table id="logsTable">
    <thead>
      <tr>
        <th>Visitor ID</th>
        <th>IP / Location</th>
        <th>Browser</th>
        <th>Action</th>
        <th>Time</th>
      </tr>
    </thead>
    <tbody id="logsBody">
      <?php if (!empty($formattedLogs)): ?>
        <?php foreach ($formattedLogs as $log): ?>
<tr class="log-row">
  <td><?= htmlspecialchars($log['visitor_id']) ?></td>
<td class="ip-location"><?= $log['ip_location'] /* raw HTML */ ?></td>
  <td><?= htmlspecialchars($log['browser']) ?></td>
  <td><?= htmlspecialchars($log['action']) ?></td>
  <td><?= htmlspecialchars($log['timestamp']) ?></td>
</tr>

        <?php endforeach; ?>
      <?php else: ?>
        <tr><td colspan="5">No logs to display.</td></tr>
      <?php endif; ?>
    </tbody>
  </table>
</div>
<!-- ─── Error Logs Section ────────────────────────────────────────────── -->
<div id="errors" class="hidden">
  <h2>PHP Error Logs</h2>
  <button onclick="sortErrors(true)">🆕 Newest First</button>
  <button onclick="sortErrors(false)">📜 Oldest First</button>
  <button id="clearErrorsBtn" style="background:#e74c3c; color:#fff; margin-left:10px;">
  🗑️ Clear Error Logs
</button>

  <table id="errorTable">
    <thead>
      <tr><th>Time</th><th>Error</th></tr>
    </thead>
    <tbody id="errorBody">
      <?php
        $errs = @file(__DIR__ . '/error.log', FILE_IGNORE_NEW_LINES|FILE_SKIP_EMPTY_LINES) ?: [];
        foreach ($errs as $line) {
          // split on first space after timestamp
          if (preg_match('/^\[?(?<time>[^]]+)\]? (.+)$/', $line, $m)) {
            echo '<tr class="err-row"><td>'.htmlspecialchars($m['time']).'</td>'
                .'<td>'.htmlspecialchars(substr($line, strlen($m['time'])+2)).'</td></tr>';
          } else {
            echo '<tr class="err-row"><td></td><td>'.htmlspecialchars($line).'</td></tr>';
          }
        }
      ?>
    </tbody>
  </table>
</div>

</div>
<script>
function showTab(tabId) {
  document.getElementById('gallery').style.display = tabId === 'gallery' ? 'block' : 'none';
  document.getElementById('logs').style.display    = tabId === 'logs'    ? 'block' : 'none';
}
document.addEventListener('DOMContentLoaded', () => {
  const tab = location.hash.substring(1);
  showTab(tab === 'gallery' ? 'gallery' : 'logs');
});

document.querySelectorAll('.delete-btn').forEach(btn => {
  btn.addEventListener('click', () => {
    const file = btn.dataset.file;
    if (confirm('Delete ' + file + '?')) {
      fetch(`admin.php?delete=${encodeURIComponent(file)}`)
        .then(r => r.json())
        .then(data => {
          if (data.status === 'success') btn.closest('.photo-item').remove();
          else alert('Failed to delete');
        });
    }
  });
});

document.getElementById('clearLogsBtn').addEventListener('click', () => {
  if (!confirm('Clear all logs?')) return;
  fetch('admin.php?clearlogs=1')
    .then(r => r.json())
    .then(data => {
      if (data.status === 'success') {
        document.querySelector('#logsBody').innerHTML = '<tr><td colspan="5">No logs to display.</td></tr>';
        alert('Logs cleared');
      } else {
        alert('Failed to clear logs');
      }
    });
});

function sortLogs(newestFirst) {
  const rows = Array.from(document.querySelectorAll('.log-row'));
  rows.sort((a,b) => {
    const da = new Date(a.cells[4].textContent);
    const db = new Date(b.cells[4].textContent);
    return newestFirst ? db - da : da - db;
  });
  rows.forEach(r => document.getElementById('logsBody').appendChild(r));
}

function filterLogs() {
  const q = document.getElementById('logSearch').value.toLowerCase();
  document.querySelectorAll('.log-row').forEach(row => {
    row.style.display = Array.from(row.cells).some(c => c.textContent.toLowerCase().includes(q)) ? '' : 'none';
  });
}
function showTab(tabId) {
  ['gallery','logs','errors'].forEach(id=>
    document.getElementById(id).style.display = (id===tabId?'block':'none')
  );
}
function sortErrors(newestFirst) {
  const rows = Array.from(document.querySelectorAll('.err-row'));
  rows.sort((a,b)=>{
    const ta = new Date(a.cells[0].textContent),
          tb = new Date(b.cells[0].textContent);
    return newestFirst ? tb - ta : ta - tb;
  });
  rows.forEach(r=>document.getElementById('errorBody').appendChild(r));
}
document.getElementById('clearErrorsBtn').addEventListener('click', ()=>{
  if (!confirm('Really clear all PHP error logs?')) return;
  fetch('admin.php?clearerrors=1')
    .then(res=>res.json())
    .then(json=>{
      if (json.status==='success') {
        // empty the table
        document.getElementById('errorBody').innerHTML =
          '<tr><td colspan="2">No errors to display.</td></tr>';
        alert('Error log cleared');
      } else {
        alert('Failed to clear error log');
      }
    });
});

</script>
</body>
</html>
