From b148c85e515b2d6530216e5bca8afc3c8a5fc09a Mon Sep 17 00:00:00 2001 From: Sascha Leib Date: Fri, 12 Sep 2025 15:38:28 +0200 Subject: [PATCH] Improved session handling and other changes CSS simplifications, user-defined config, etc. --- action.php | 53 +- admin.php | 7 +- client.js | 12 +- {config => conf}/botmon-config.json | 4 +- {config => conf}/known-bots.json | 42 +- {config => conf}/known-clients.json | 0 {config => conf}/known-platforms.json | 0 img/addr.png | Bin 0 -> 1643 bytes img/ahrefs.png | Bin 806 -> 0 bytes img/android.svg | 1 - img/anthropic.png | Bin 860 -> 0 bytes img/aol.png | Bin 960 -> 0 bytes img/apple.svg | 1 - img/babbar.png | Bin 1446 -> 0 bytes img/bing.svg | 1 - img/bots.png | Bin 0 -> 6498 bytes img/brave.svg | 1 - img/bytedance.svg | 65 --- img/ccbot.svg | 1 - img/chrome.svg | 1 - img/chromeold.svg | 1 - img/chromium.svg | 144 ------ img/clients.png | Bin 0 -> 15217 bytes img/dataforseo.png | Bin 1198 -> 0 bytes img/ddg.svg | 1 - img/ecosia.svg | 1 - img/fileview.svg | 1 - img/firefox.png | Bin 3012 -> 0 bytes img/freebsd.png | Bin 2026 -> 0 bytes img/google.svg | 1 - img/hive.svg | 105 ---- img/hmos.svg | 1 - img/huawei.png | Bin 2065 -> 0 bytes img/hunter.png | Bin 952 -> 0 bytes img/idtyp.png | Bin 0 -> 4407 bytes img/ios.svg | 1 - img/ip4.svg | 1 - img/ip6.svg | 1 - img/linux.svg | 1 - img/localhost.svg | 1 - img/macos.svg | 1 - img/majestic.png | Bin 1914 -> 0 bytes img/meta.svg | 1 - img/msedge.svg | 1 - img/msie.svg | 16 - img/netestate.png | Bin 1783 -> 0 bytes img/openai.svg | 1 - img/opera.svg | 1 - img/perplexity.svg | 49 -- img/petal.svg | 110 ---- img/placeholder.svg | 1 - img/plagaware.png | Bin 2029 -> 0 bytes img/platforms.png | Bin 0 -> 12169 bytes img/qwant.svg | 1 - img/robot.svg | 1 - img/safari.png | Bin 3236 -> 0 bytes img/samsung.svg | 1 - img/scriptrun.svg | 1 - img/semrush.png | Bin 745 -> 0 bytes img/serpstat.svg | 56 -- img/seznam.svg | 1 - img/spinner.svg | 168 ------ img/tizen.png | Bin 1203 -> 0 bytes img/uc.svg | 92 ---- img/vivaldi.svg | 59 --- img/win11.svg | 1 - img/winold.png | Bin 2683 -> 0 bytes img/yahoo.svg | 1 - img/yandex.svg | 1 - plugin.info.txt | 2 +- pview.php | 23 +- script.js | 294 ++++++----- style.less | 702 +++++++++++++------------- tick.php | 20 +- 74 files changed, 622 insertions(+), 1432 deletions(-) rename {config => conf}/botmon-config.json (96%) rename {config => conf}/known-bots.json (90%) rename {config => conf}/known-clients.json (100%) rename {config => conf}/known-platforms.json (100%) create mode 100644 img/addr.png delete mode 100644 img/ahrefs.png delete mode 100644 img/android.svg delete mode 100644 img/anthropic.png delete mode 100644 img/aol.png delete mode 100644 img/apple.svg delete mode 100644 img/babbar.png delete mode 100644 img/bing.svg create mode 100644 img/bots.png delete mode 100644 img/brave.svg delete mode 100644 img/bytedance.svg delete mode 100644 img/ccbot.svg delete mode 100644 img/chrome.svg delete mode 100644 img/chromeold.svg delete mode 100644 img/chromium.svg create mode 100644 img/clients.png delete mode 100644 img/dataforseo.png delete mode 100644 img/ddg.svg delete mode 100644 img/ecosia.svg delete mode 100644 img/fileview.svg delete mode 100644 img/firefox.png delete mode 100644 img/freebsd.png delete mode 100644 img/google.svg delete mode 100644 img/hive.svg delete mode 100644 img/hmos.svg delete mode 100644 img/huawei.png delete mode 100644 img/hunter.png create mode 100644 img/idtyp.png delete mode 100644 img/ios.svg delete mode 100644 img/ip4.svg delete mode 100644 img/ip6.svg delete mode 100644 img/linux.svg delete mode 100644 img/localhost.svg delete mode 100644 img/macos.svg delete mode 100644 img/majestic.png delete mode 100644 img/meta.svg delete mode 100644 img/msedge.svg delete mode 100644 img/msie.svg delete mode 100644 img/netestate.png delete mode 100644 img/openai.svg delete mode 100644 img/opera.svg delete mode 100644 img/perplexity.svg delete mode 100644 img/petal.svg delete mode 100644 img/placeholder.svg delete mode 100644 img/plagaware.png create mode 100644 img/platforms.png delete mode 100644 img/qwant.svg delete mode 100644 img/robot.svg delete mode 100644 img/safari.png delete mode 100644 img/samsung.svg delete mode 100644 img/scriptrun.svg delete mode 100644 img/semrush.png delete mode 100644 img/serpstat.svg delete mode 100644 img/seznam.svg delete mode 100644 img/spinner.svg delete mode 100644 img/tizen.png delete mode 100644 img/uc.svg delete mode 100644 img/vivaldi.svg delete mode 100644 img/win11.svg delete mode 100644 img/winold.png delete mode 100644 img/yahoo.svg delete mode 100644 img/yandex.svg diff --git a/action.php b/action.php index 1b5406d..edb8599 100644 --- a/action.php +++ b/action.php @@ -23,6 +23,10 @@ class action_plugin_botmon extends DokuWiki_Action_Plugin { $controller->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'insertHeader'); } + /* session information */ + private $sessionId = 'unset'; + private $sessionType = ''; + /** * Inserts tracking code to the page header * @@ -33,12 +37,15 @@ class action_plugin_botmon extends DokuWiki_Action_Plugin { global $INFO; + // populate the session id and type: + $this->getSessionInfo(); + // is there a user logged in? $username = ( !empty($INFO['userinfo']) && !empty($INFO['userinfo']['name']) ? $INFO['userinfo']['name'] : ''); // build the tracker code: - $code = NL . DOKU_TAB . "document._botmon = {'t0': Date.now()};" . NL; + $code = NL . DOKU_TAB . "document._botmon = {'t0': Date.now(), 'session': '" . json_encode($this->sessionId) . "'};" . NL; if ($username) { $code .= DOKU_TAB . 'document._botmon.user = "' . $username . '";'. NL; } @@ -68,22 +75,11 @@ class action_plugin_botmon extends DokuWiki_Action_Plugin { global $conf; global $INFO; - // what is the session identifier? - $sessionId = $_COOKIE['DokuWiki'] ?? ''; - $sessionType = 'dw'; - if ($sessionId == '') { - $sessionId = $_SERVER['REMOTE_ADDR'] ?? ''; - if ($sessionId == '127.0.0.1' || $sessionId == '::1') { - $sessionId = 'localhost'; - } - $sessionType = 'ip'; - } - // clean the page ID $pageId = preg_replace('/[\x00-\x1F]/', "\u{FFFD}", $INFO['id'] ?? ''); // collect GeoIP information (if available): - $geoIp = 'XX'; /* User-defined code for unknown country */ + $geoIp = ( $this->sessionId == 'localhost' ? 'local' : 'ZZ' ); /* User-defined code for unknown country */ try { if (extension_loaded('geoip') && geoip_db_avail(GEOIP_COUNTRY_EDITION)) { $geoIp = geoip_country_code_by_name($_SERVER['REMOTE_ADDR']); @@ -98,8 +94,8 @@ class action_plugin_botmon extends DokuWiki_Action_Plugin { $logArr = Array( $_SERVER['REMOTE_ADDR'] ?? '', /* remote IP */ $pageId, /* page ID */ - $sessionId, /* Session ID */ - $sessionType, /* session ID type */ + $this->sessionId, /* Session ID */ + $this->sessionType, /* session ID type */ $username, $_SERVER['HTTP_USER_AGENT'] ?? '', /* User agent */ $_SERVER['HTTP_REFERER'] ?? '', /* HTTP Referrer */ @@ -126,4 +122,31 @@ class action_plugin_botmon extends DokuWiki_Action_Plugin { /* Done */ fclose($logfile); } + + private function getSessionInfo() { + + // what is the session identifier? + if (isset($_SESSION)) { + $sesKeys = array_keys($_SESSION); /* DokuWiki Session ID preferred */ + foreach ($sesKeys as $key) { + if (substr($key, 0, 2) == 'DW') { + $this->sessionId = $key; + $this->sessionType = 'dw'; + return; + } + } + } + if ($this->sessionId == '') { /* no DokuWiki Session ID, try PHP session ID */ + $this->sessionId = session_id(); + $this->sessionType = 'php'; + } + if ($this->sessionId == '') { /* no PHP session ID, try IP address */ + $this->sessionId = $_SERVER['REMOTE_ADDR'] ?? ''; + $this->sessionType = 'ip'; + } + if ($this->sessionId == '') { /* if everything else fails, just us a random ID */ + $this->sessionId = rand(1000000, 9999999); + $this->sessionType = 'rand'; + } + } } \ No newline at end of file diff --git a/admin.php b/admin.php index 5bc1797..aae7228 100644 --- a/admin.php +++ b/admin.php @@ -32,6 +32,9 @@ class admin_plugin_botmon extends AdminPlugin { global $conf; + // spinner animation as SVG image: + $svg = ''; + $pluginPath = $conf['basedir'] . 'lib/plugins/' . $this->getPluginName(); /* Plugin Headline */ @@ -44,7 +47,7 @@ class admin_plugin_botmon extends AdminPlugin { '; if ($this->hasOldLogFiles()) { - echo '
Note: There are old log files that can be deleted. Click here to run a delete script, or use cron to automatically delete them.
'; + echo '
Note: There are old log files that can be deleted. Click here to run a delete script, or use cron to automatically delete them.
'; } echo '
@@ -75,7 +78,7 @@ class admin_plugin_botmon extends AdminPlugin {
- busy indicator + ' . $svg . ' Initialising …
diff --git a/client.js b/client.js index 8402037..91b7c7b 100644 --- a/client.js +++ b/client.js @@ -24,8 +24,9 @@ botmon_client = { const visit = { 'pg': JSINFO.id, 'u': document._botmon.user || null, - 'lg': navigator.language, + 'lg': navigator.language.substring(0,2), 'lt': ( document._botmon ? Date.now() - document._botmon.t0 : null), + 'id': (document._botmon.session || 'null').replaceAll('\"', ''), 'r': document.referrer /*, 'tz': new Date().getTimezoneOffset(), 'url': window.location.href, @@ -55,10 +56,15 @@ botmon_client = { //console.info('botmon_client._onHeartbeat', url); let uid = document._botmon.user || null; + let sessionId = (document._botmon.session || 'null').replaceAll('\"', '') try { - const response = await fetch(url + '?p=' + encodeURIComponent(JSINFO.id) + '&t=' + Date.now() + ( uid ? '&u=' + encodeURIComponent(uid) : ''), { - method: 'HEAD' + const req = '?p=' + encodeURIComponent(JSINFO.id) + + '&t=' + encodeURIComponent(Date.now()) + + ( sessionId ? '&id=' + encodeURIComponent(sessionId) : '') + + ( uid ? '&u=' + encodeURIComponent(uid) : ''); + const response = await fetch(url + req, { + /*method: 'HEAD'*/ }); if (!response.ok) { throw new Error(response.status + ' ' + response.statusText + ' - ' + url); diff --git a/config/botmon-config.json b/conf/botmon-config.json similarity index 96% rename from config/botmon-config.json rename to conf/botmon-config.json index 06b704a..c17bd77 100644 --- a/config/botmon-config.json +++ b/conf/botmon-config.json @@ -65,8 +65,8 @@ "id": "isFrom", "desc": "Location is in a known bot-spamming country.", "bot": 50 }, - {"func": "notFromCountry", "params": ["DE", "AT", "CH", "LI", "LU", "BE"], - "id": "notFromHere", "desc": "Location is not among the site’s main target countries.", + {"func": "matchesCountry", "params": ["ZZ"], + "id": "zzCtry", "desc": "Location could not be determined", "bot": 20 } ], diff --git a/config/known-bots.json b/conf/known-bots.json similarity index 90% rename from config/known-bots.json rename to conf/known-bots.json index b59c634..40ab292 100644 --- a/config/known-bots.json +++ b/conf/known-bots.json @@ -1,17 +1,17 @@ [ {"id": "bingbot", - "n": "Bing Bot", + "n": "BingBot", "r": ["bingbot"], "rx": ["\\sbingbot\\/(\\d+\\.\\d+);"], "url": "http://www.bing.com/bingbot.htm" }, {"id": "googlebot", - "n": "Google Bot", + "n": "GoogleBot", "r": ["Googlebot"], "rx": ["Googlebot\\/(\\d+\\.\\d+)", "Googlebot-Image\\/(\\d+\\.\\d+)"], "url": "http://www.google.com/bot.html" }, {"id": "googleads", - "n": "Google Ads Bot", + "n": "Google Ads", "r": ["AdsBot-Google", "AdsBot-Google-Mobile", "Mediapartners-Google"], "rx": ["AdsBot-Google;","AdsBot-Google-Mobile;", "Mediapartners-Google\\/(\\d+\\.\\d+);"], "url": "https://developers.google.com/search/docs/crawling-indexing/google-special-case-crawlers" @@ -35,31 +35,31 @@ "url": "http://help.yahoo.com/help/us/ysearch/slurp" }, {"id": "ddg", - "n": "DuckDuckGo Bots", + "n": "DuckDuckGo", "r": ["DuckDuckBot","DuckAssistBot","DuckDuckGo-Favicons-Bot"], "rx": ["DuckDuckBot\\/(\\d+\\.\\d+);", "DuckAssistBot\\/(\\d+\\.\\d+);", "DuckDuckGo-Favicons-Bot\\/(\\d+\\.\\d+);"], "url": "https://duckduckgo.com/duckduckbot.html" }, {"id": "openai", - "n": "OpenAI/ChatGPT Bots", + "n": "OpenAI/ChatGPT", "r": ["OAI-SearchBot", "ChatGPT-User", "GPTBot"], "rx": ["OAI-SearchBot\\/(\\d+\\.\\d+);", "ChatGPT-User\\/(\\d+\\.\\d+);", "GPTBot\\/(\\d+\\.\\d+);"], "url": "https://platform.openai.com/docs/bots/" }, {"id": "claude", - "n": "Anthropic Claude Bots", + "n": "Anthropic Claude", "r": ["ClaudeBot", "Claude-User", "Claude-SearchBot"], "rx": ["ClaudeBot\\/(\\d+\\.\\d+);"], "url": "https://darkvisitors.com/agents/claudebot" }, {"id": "perplexity", - "n": "Perplexity Crawlers", + "n": "Perplexity", "r": ["PerplexityBot", "Perplexity‑User"], "rx": ["PerplexityBot\\/(\\d+\\.\\d+);", "Perplexity‑User\\/(\\d+\\.\\d+);"], "url": "https://perplexity.ai/perplexitybot" }, {"id": "metabots", - "n": "Meta/Facebook Bots", + "n": "Meta/Facebook", "r": ["facebookexternalhit", "facebookcatalog","meta-webindexer","meta-externalads","meta-externalagent","meta-externalfetcher"], "rx": ["facebook\\w+\\/(\\d+\\.\\d+)", "meta-\\w+\\/(\\d+\\.\\d+)"], "url": "https://developers.facebook.com/docs/sharing/webmasters/crawler" @@ -71,43 +71,43 @@ "url": "https://help.qwant.com/bot/" }, {"id": "yandex", - "n": "Yandex Bots", + "n": "Yandex", "geo": "CN", "r": ["YandexBot", "YandexAdNet", "YandexBlogs", "YandexImages", "YandexImageResizer", "YandexMarket", "YandexMedia", "YandexOntoDB", "YandexSitelinks","YandexSpravBot", "YandexVertis", "YandexVerticals", "YandexVideo", "YandexWebmaster", "YandexComBot"], "rx": ["Yandex\\w+\\/(\\d+\\.\\d+);"], "url": "http://yandex.com/bots" }, {"id": "seznambot", - "n": "SeznamBot (CZ)", + "n": "SeznamBot", "geo": "CZ", "r": ["SeznamBot"], "rx": ["SeznamBot\\/(\\d+\\.\\d+);"], "url": "https://o-seznam.cz/napoveda/vyhledavani/en/seznambot-crawler/" }, {"id": "ahrefs", - "n": "Ahrefs Bots (SEO/marketing)", + "n": "Ahrefs", "r": ["AhrefsBot", "AhrefsSiteAudit"], "rx": ["AhrefsBot\\/(\\d+\\.\\d+);", "AhrefsSiteAudit\\/(\\d+\\.\\d+);"], "url": "https://ahrefs.com/robot/" }, {"id": "ccbot", - "n": "Common Crawl Bot (AI-Scraper)", + "n": "CommonCrawl Bot", "r": ["CCBot"], "rx": ["CCBot\\/(\\d+\\.\\d+)[\\s\\.;]*"], "url": "https://commoncrawl.org/bot.html" }, {"id": "mjbot", - "n": "Majestic Crawler (UK)", + "n": "Majestic Crawler (UK)", "geo": "GB", "r": ["MJ12bot"], "rx": ["MJ12bot\\/v?(\\d+\\.\\d+)[\\s\\.;]"], "url": "http://www.majestic12.co.uk/bot.php" }, {"id": "petal", - "n": "PetalSearch Bot (CN)", + "n": "PetalSearch Bot (CN)", "geo": "CN", "r": ["PetalBot", "AspiegelBot"], "rx": ["[\\s;]PetalBot[\\s\\/;]", "AspiegelBot[\\)$]"], "url": "https://webmaster.petalsearch.com/site/petalbot" }, {"id": "barkrowler", - "n": "Barkrowler (Babbar Bot)", + "n": "Barkrowler (Babbar)", "r": ["Barkrowler"], "rx": ["[\\s;^]Barkrowler\\/(\\d+\\.\\d+)?"], "url": "https://babbar.tech/crawler" @@ -119,7 +119,7 @@ "url": "http://www.semrush.com/bot.html" }, {"id": "bytespider", - "n": "Bytespider (ByteDance, TikTok)", + "n": "Bytespider (ByteDance, TikTok)", "geo": "CN", "r": ["Bytespider"], "rx": ["Bytespider[;$]"], "url": "https://darkvisitors.com/agents/bytespider" @@ -143,7 +143,7 @@ "url": "https://serpstatbot.com/" }, {"id": "netestate", - "n": "netEstate NE Crawler (DE)", + "n": "netEstate NE Crawler", "geo": "DE", "r": ["netEstate NE Crawler"], "rx": ["netEstate NE Crawler\\s"], "url": "http://www.website-datenbank.de/" @@ -167,7 +167,7 @@ "url": "https://darkvisitors.com/agents/mauibot" }, {"id": "plagaware", - "n": "PlagAwareBot (DE)", + "n": "PlagAwareBot (DE)", "geo": "DE", "r": ["PlagAwareBot"], "rx": ["PlagAwareBot\\/(\\d\\.\\d)"], "url": "https://www.plagaware.com/bot" @@ -213,5 +213,11 @@ "r": ["TerraCotta"], "rx": ["TerraCotta"], "url": "https://github.com/CeramicTeam/CeramicTerracotta" + }, + {"id": "tiktok", + "n": "TikTok Spider", "geo": "CN", + "r": ["TikTokSpider"], + "rx": ["TikTokSpider"], + "url": "https://darkvisitors.com/agents/tiktokspider" } ] \ No newline at end of file diff --git a/config/known-clients.json b/conf/known-clients.json similarity index 100% rename from config/known-clients.json rename to conf/known-clients.json diff --git a/config/known-platforms.json b/conf/known-platforms.json similarity index 100% rename from config/known-platforms.json rename to conf/known-platforms.json diff --git a/img/addr.png b/img/addr.png new file mode 100644 index 0000000000000000000000000000000000000000..a99f87479960714ebb959aa91623f72847afaa11 GIT binary patch literal 1643 zcmZ8hdpOf;9RCfQ+eRp6VvZDtVsf3dV{Di*6eZ1NLoC;_B6FKnPQ#K*oDx#V@cy`JDi0DQ@_@Y!P}#M03JfFy@lJRExN}i5_m1Sc%zf zjDZyXn7XkMTKHp97N|Fl7&uq#d*uPF1*m>@8DTIR*%nb-Nv0ii7ubg)5%6vv_MdX; zsa}4_r``8Xb2vK)q4@HWwlr;@pPwfAUiU%QxHr^dUyx}NjRn-&Y!yB_2*M<%=qM0qb21Nu*k7Oy(U zRQphjBH|>SpMS`kchR+T?FG{6Gj_@qHwrnIwjZm3X>7Z%e5jfK3Sm>91-39KFj&AuwSkj;@&OC3-yGPs#-i=2ur@MQLm-eiL-<&zY484IXS%Q8nM_ zzQH|*Cj>{ND<5m+LgP%L#nrvS1xdNpDTgwBlt-T3%3uYKdd#(0nhw~S-glpsd)?$1 z*L#%W3}x?dj@WCdAa}lAwU=JTB2o5Qr}b;YpQBNMPcN=x!r(Ki~cBOD_YfP5htj6K{2SpxS3$(Yi2?)$(5>>8!-HUp|~~n%n+)yKb5V zf8lrlJ=!tbiPU9qBW? zXuI|#v@o_I2PgN&T?M~{f25FqHr%@2Z?4=dSn~}rG#I^A=ybpPLUHBDj#2aEj7iTd z1Am*PsNsYx?SC}0r?o}N3Mg`_y-8hCi)8ADx)U?kBt+H;OBOBa-P3wqF#Bxo{?$%i zzT*Kk{-$F|_&=*$>J4jh^rvd6Me^}cT(nB5fSf)g2==wgilZ(D@N=eCQ~KK|hAJzV zXjR(Zy9MY0Y&Y!>jR)=V3Uk$GMyx~NpO-Vk5b?~kQr&^K&ZzzMZ!ID!vt_UFWZ?n0 zw$bwS3EKrF5&2S@TE_3J!!fX7FIxe32F>GCH8l0T;%=`N}W9uEdW^3zya8cmw!?S*UMC|ge40+iIPl`q7xW#MuA^r~GJUp>q?{+XDU%LP zhDXV19)Iz8Sg{yyQv;f|a7+so6h=AA8gC;aR}#jwEL}hw!D}J9E*iey!}2({!oI!n NW0HtuLZyvw(!Wf9x^Msh literal 0 HcmV?d00001 diff --git a/img/ahrefs.png b/img/ahrefs.png deleted file mode 100644 index 1802d9ff6d4e74118f4e57df5d0aa57a61185d37..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 806 zcmV+>1KIqEP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0=r2>K~y+TwNy<^ z6G0Sy^Rr90w1vuAL81H@i6J&5UeJRH9F>#tV)TN72PFotUOX5tgaaH%42fPuFPdmV zq9;9=c<^E(5+V^btx710(3TR~?(U4Q-C}o3Ax81bYj%F#d^7KxZ%UL?A7D2?i{F37 z|0FVGrNHq*$YNGG%83O2vJy77ghfD53=@FZscyK$HY|wLlF1wO!2lD^t)+x#_epF{ zFh2b8%tTUGXnsd0+$R#?QAk^}7H-s9nj8`Kw&-)szR}jeNRVehlC3qmiSW=^gtb+N zLTM&Q6AVF+2&1eDTxCs7nTo>f0^GDl+i--}(rDRt- z?;r9-4r?J@@l`Xeim5756fG!9*Cz>(tIHgFJeGP7W&*DY+SD!o3q|It{>wf+V)x;?)$ zN<<2W*_e3xV%6?)Ml?@;7LER9W-XDjH6lO_T!fcM@je_+fU!eYi%q;KjXZgksj+gk zerj50iIpmN9W(q4U6Kct9wPHX6j1p;8|l!yxJ=pfp`(Z*${gwt+X0Rgw8VnI kW?7V>GSOdPmxus<0YF6&9(rn51ONa407*qoM6N<$g1&fRG5`Po diff --git a/img/android.svg b/img/android.svg deleted file mode 100644 index 4e58649..0000000 --- a/img/android.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/img/anthropic.png b/img/anthropic.png deleted file mode 100644 index 18ea8a0a7e1712982c37d711384dbefd17f8e5ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 860 zcmV-i1Ec(jP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGf6951U69E94oEQKA0`W;iK~zXft(MPA z({UKbpXFufL7_!O&BQ}>@}QmCk}(w%4FVB#7a>Y1cE}$IGMM+QPEz2(x%Cfp*&NA6 z=!B^!JxGf4SBI$9QuJWd_UZjR-|r^-;jHupZ$6*T^Sqzu^WFFR`F@#!ilCIbiQztE zgRVnni1`GqK_8%Z27}=v2mcy0u7-TjA#@V#c?(tR<;8)q6G}k;3fFY%Z3+W}Q>>@M zskh4piFPf2Cba8qH4wN0eUa4Jz`d?=Z#hL+yvFdD=edMJAzE5mBBRkr4u^v(Dk>-# z4AS!Q64lk+qK1YB-I>Q5oUSL_+zjnPdF<`&DXZ0@U=~eJPfI)!iOAYwv54mwIAP`u zdSqFExw*MabC%QTRLNvg9UL5}du?qJr_@&Mx9;Si3|h+;ynf%Cl`6ET(-8hGFQG4TT`!Ij>>#|d|dL|+uNBudyip}e?d8v zMN=jq1_E2dcmSsmN-%E%Cm- zK9x$Pq-k?=v&6Wj0Q0p(^oY5)w^z=5F6sM@2d@$d z?V~#|Fd#9H$0KWBt_WZJhTa&75rkDqVM%xNb!1@J z*w6hZkrl|_8{iY-`v3p`zyJRJ{&Vx{gY##vyxOw=-pvPZ|Ni^_=imN^FIR6rc53yG ztt^`4W? zc^$FoQ1afBub*-h?)t3X|IKN^PnTVP5-$Dee)YHa&_}-$e~KUeS@`|$p8ZPak27uF zZMS7D!;gP&R;)69$F<=#&?B4$9+AZi419+{nDKc2iWH!rM2TxeNpOBzNqJ&XDnmeG zW?qS&pKFMMsh**pg>>et6+kuHQX@RmJUz7-IDi~h1}R2X21X#u3y7tmY*4UjFfxP1 zK>=&X$iyH3q@#d1vz-Mjo&{usz~ada3@?C+U^JSg3_z&~>vp@3Xlx~Oh9v)z$$|*Er2YjE<*zYknApb3+JCbdY!=dUFPZH7@`quJCVD1m4QGj zC)1}%+e3RiLYfj-4lPc&`0IatnEAbX^Ae3x_Rrb8xs%1oW6dY0z);?U@Air|-Cvrg z<8ygaXmqS+y@S)P?s7)Q6OoUnq)eIgr(~bV(VZr5Js9>{T=2Q#`RGJd zU`&zBLxxRrl+JI`+53)H-E#f`hXr#rJx_Z(9yp-%_i>ox`#BAg?-L#@662NH`*8cK zveoOJ_$IJ1ZYsO_f$s`G?_*70!z$)ecBU)({u|!GXWQw!WmpSb+z^4*N00U-bP0l+XkKnO~Y` diff --git a/img/apple.svg b/img/apple.svg deleted file mode 100644 index 04dc1c8..0000000 --- a/img/apple.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/img/babbar.png b/img/babbar.png deleted file mode 100644 index ffede22a8b3fbaf82f8da8c05a73a7a737b21fd6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1446 zcmV;X1zGxuP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1v^PZK~y+TZB=Pd zQ&$xJl0cBiY9h9{AX^56wnV95-IxmE!cb|gGY->^woaGnHq%90rc-CEwU$xaL2wv% zR0>uQY()hkP}5*o6j@X-1c-(}0wDnsASC4W-T-dx_v5`Y=brn$^UnRwxg0_W{)3Sb zYinCin0StnxNon9jUapmB0TZ32#aPz=sp$pG`LgmXOVMOzGU%vi^b|7Fi&76P%(s0 zRahm5M2b_*FpN$`KE^XdT_#khnPE0t0awa0-xHPVP?U&U>(Q|mMN1IvhWA>KT!~vf z&OOt3LexHhz`vn1F`LWf&?kq(86UT|+*UQzC^agL2$oG^>?*8OZ++PKWJJ!@c$%_%$2{IZX zA4Z7;%jQn{8Hj^;c?n9(HdR(_&Og6q`O;aRe^wjt>bZ)_yJ14)F9TfgNyBu#=&4md zBFG~@*HDvKtv32RaOf&j?V`6Nu|xyQ>tPck2kVauHAuL72t+< z7GcCZT2Xo5$q&rtm@U?S^Z%&l0jWV$b!gIqt26>Otngc>sL-qox>B`ll+p_n|OSU&Pr@pmC zl(ey|x#gim61ekQaoWKLhW^1wKlV2bec-BxSj_^wF=(8^xw5=? zu`xlzc5J9Zm=ujVh=b>(zB@-zr=#NXf6<4A4GdUZfPfh&9-Gz??KdX_XWTYHUp_vp zop@X>kAnrS>`Q!F4<}d@J8P%y+%pNT(2WWSmT`D`xQ9gvR2>7<8x%O3{#t#5TEN4Z zIA{|QE`m~}&po4C7V`q1@1p6ZVH}aj!v=JYVXFY#g?+Zgk7T7~O;i+KWVEqKo%X{un#!9g68a_S_4eRM?|}It!w4>$5kr6U;UGZ)*{fip zlFM6xJx8*yQ@f_N9im@>9|I#YqF>7bege|3Ub{n=ZYmxCd$W#6sm(O`JGr4Iusg_C zHwX#|Wpvo>-|Q-&d#;r-wQ4km(>XW3-g)7RFVANmtx&0YsZ-hB6SXumV)5bLUL$RS zR4EDhlMIX!)*|&)CN+t!*O-)YoHoIUlT}8eg}J6dyXSgEOGsn}O|7o3oq8@S zSvt9Q*(#fm^aS?TBCP|(i}8jSx?a=%1LeORYz>d{-If|08X|IW;c2y|GHKVv3*B)E zeuvT%B~c6S^&>)tBmr{c;N^y?Q9Ce-9WoS|@RtNhp_s7QW%9Pd;+D+JZcL0h<-vb@ zt7vmd_}chLA777_J|rv9X~(^l>_8b \ No newline at end of file diff --git a/img/bots.png b/img/bots.png new file mode 100644 index 0000000000000000000000000000000000000000..bcb69b5fee2cfc37c26393ad9600fb48dcea77a6 GIT binary patch literal 6498 zcmZ8`1xy^kwl?kyi!3e$iWisS?hXYOD=fvOu(-QJp|rR!?h6zt?ohN?fzskd3Pl#T z1s?alm;A{;$(ipvGUuF0W|B!JURPTMfJcpof`S52Q&rS|M#^XD!@+u<>8VRPo&nWU zUqv1T{+)LJS;4TE(~?6$Y5a(fw8DJWaiOXvo+v2fFaIN`xu6lUXCtMTlCjqtH#;w1 zD-T-~T`NadFCJ|rgBQX){5)bVuD_(8V_I#E)$G*NI8kt(6-*RrR7@1qXQuuvH2=r{ z(+xW+`hV?c&zv6>4F&j&rqALSi}7E((=-3i@Do5o`HTMl@c%1{^6W~%M!|TFARNjAXFimo+G-iFFYQII1^XGM6D!C%-5Hw z6ITqx*+7Y*(@S{^{Df+o`5ppUl<+(`8V{}RBcWmtT8z|BuP6ox1u%vg{m_2U|G+Z<*bIx!xX$>@ydnsY7DOl3M~zyK-{6Ib ze|ERdLjgp7o(ebFX0D2nBVqYV)5AQ>X*dQ5?36lL z%zp2}*^(zq2+g)^Tvalbmm-ah>rEy}wbCt9a^7fVt$Dd0OYXbBTnT#8`WBZ*OU@X~ zrD(I*^ui{$QQGk$22Ol~;UE$HCB1|>@YqGW_pUbv2hjS5Ra)HxRo!m&j>?y<@|Xkm z9l-h%B`t0)+G*(>Bi#%=>lDO*j6IOjNgTBhlqd=7Bo2@aGblIXlDTh*# zuXy&Vm|MQ;)cG?=_)<)@I&sUJiWyySFiT?IICU00wS>4u&$5gYI1brNTCf`@vuxEg zd!hA`RYJOKs^?LzZd!L~{sC^GzDM%0zY+Dam>rCa-bx!QiV`GiWDx*unux>29OE{%AGH|1XESm>|qd>LtcNY0aDuAC4Y|O3-EvMMyM{~|fh1|BJr~c~+o|{o% zGO@Dsw;nlOdf?v(WycrkWGu>0&p!oM@M67!oPzF=Dz zLbWC8;9Ef+^V{JMwHbx=ymj7RCmUhTL)icwu=r2GyqY#&f0>=7JvWob&C^&kBC8)_ z{@<1ozkPIJ1AVYu;MifaJY23}BGFh*_EHJad$YHbO$E>EZSMXzskb|2k*{aSY%8RB zrt;QP*;IOQ5R{x*F7P5U!qu$W?F^`ay_nBZdZ?%TizL4I-9 zIVK6$GvWQVS+LsP3Z<3S%RtC}G~uif`!AoV{nf<~v&~8$%Uu>~Dl6hSMWcSZ9MnyJ z`32xz4x=>oX8^1B>6_rFGBVAQ*G+Teu*BO}d12HhKu}`=MZ60n;}vi5`*!n5v%jrq%K- z+~Y4u)i!BOaV5EYTGVdC%-1ru&!q5+?xW^waAOa(2qqW$*jb4o#WO?dXpI#nQ-Yb6 zl^Ma_uBM9pzc`h8m^k^;e%i!{5aWwXStDxOc6J8r0IcNP-iudt1}n*ynXYm523`Ea z6&yV^1Dg`IWT`lZ;SJhasX|{Lp$iT^a$9wRcmf;|B3z%gLWI>*NVrtBEE#j4XKGFvX-< z)w=CB&F}dCb+$>sskUCa;E^1=pCq;o-!mVo^_WKoMQ?i>T!Ka}xdTl7(hU<5bE=7d z+B1`F0TaA1XLVsSq2QC5LsEq_2D#jj3GbyfUa^v7gto3`HjWwQI90dCcr5qAgw)$-tP+WL_~v~FD5u1aN9vU*Cq*H+<>RnZCgqAG(hNlu8ju2kdU>u=$oA+byr_wPfl;ALLhsuq+0j8qaxbI4W1PC5J^G*TMhBhS zD2HcUIUgzF7zlDBt`IPJ1mO^GW%YRXUz84Xqz&RLUJ+|SF4K*%<%fjCx{%3fe1j1BlmtX@7UkL5z-IT!<|iI>mSQ|n3lGp@-h>WXI% zUHLpc38$i>8oR$bI-joX@vqa_eR$)bcw3t;l3b*^E&Pt?y#T>K- z*ir3l2+nElu%_7=Hh_|^FEptS!G$7HjH1A*$!Nq<{vsyZ{_I0r#7)HG!@X}t zG)iv-i$=yatdFoMB0bCgy|<`9T4mh2Rb0zum|&(UzL^46tWm1F!^o6m6n)B*#dJ9e z=92f}2TP%EA$^m2$ z^F_pKJ_(8Y1RJzgdOlq!Js$UtC_dj9=gfFh`E2fKjZvLAD<&0=$I=Ij?ttMw>$8c_ zbIew07pzD6OiVliO)Fs#3I`88ivs&QGq?D~ zI@9=@8$Z2z*SGx8K9t7I^J&a8tuv^J?o7IaDh%>wX3eugJANdI`c#BH;OZ~q;|=nB z>+8c^{OG7^IJcqXYuCIRyJ`Bk0}%!TnrxY@DXa%J}Gb*V?V@ z)5&?A`zfFU6MYv$Q`5sOt-VD+o#|FdH2wpUSL8j(*x1-sMhrm7-GctyXq;ZiWhRU; z^r;(88b-%)ePFmOk7Xp#zb5c~L-btS`%u+QJ6D-b+_yY(Jw$_&#`J#KJ}vlyy<5r} ziz1!%^R7vg5BJe>XJ)F<{i-hqFYiaw7H5@CpV-hI2uqfUL6trW^*Nagd{d03d}zF4 zhwH-4*|^^|E4Gb7>bN_zHTafAxcx{Z0w3l+EvaDX@|!iCR;GVFe*fn5#=ZC5B$N68 z2FI&cX^zSzW^QH7%V$R?u2o^!na>4N74rENVm{KUQSg|<)};_A{ldDI?7M4{uN^;x?Xizlz_ww42wWOBLHn zorea`^{ZJf{2&NLbIz94J=SzmUVme`_V7)1Hrz$ zU*lQvaKr`E$7|A6!^v!64N+P`_q*rTfj;PmgwhW;)-u!PW9CV#IOoUz=2bc}sTXP{ zlpASKEqy@*FU=2O4exC6f4XO*X^AH;0_cTQ@3_|dGD6PcWj;!AB*^+Xnnq0(P1&|GIQuQhze&wUF{h z*@#5B=a8nPv{i7u+YxIu{`jgWnY)uK$mN#k5lk#O%B(FJ*Ne1r7PL7ZW(Xxe#ha>s z|CG!%KX`&*3%`rF0Zo|B2;>}^#?BCRMi8?}53R>uVhk2enbB~~_J)sLly35d=B(+K zANdigKiUj&<0YoeD{-mFcvU-5f3l69s;n5F@SIllQR+FsRN6 zkWf;VNBtr^OHg!lZjb+nwY5xvN?lxRO9h-92-f`)r4iNVAbINz8^?_X=CP@0_t9E^ zUzls+&N|%sN9$QFqR%m4sKXft%`f(ybMciT$)=Zf@8 zZ?I$~9k--Jly@m-ev2LHPnS&(N80PYio^C{b>N9QiG@zel@Z-Gqi$dh80ZpNZ`8&w zHpRQRAqWr)lWzma>~ao0=DWNYUVaRR1WOuRzNHT2Ku~}hN6;$2M^4s#OKm8rv&kO4 zK>W&rvpMibS^A=SItN8BdQQU>HTo@^@=#|7;}9!g`2MP431f5nwq3vtY3(Hp18BKE zA@)8}UgysVV>0aV#ogcz?!}5Qg%*#TGsx3=d~cZLgoWTR9O`3=Bn=PvtZ)(7Ed7@! z*$&J*u#O6}ctxWs1d4p(PTqFlW8p_PE|YyRy)+D4SIwZ)k-Z62mJ}-JLhy~8ptEmM zjagUanvWJNEyc=%1?Yc(e&7uC{xindoB*y->g+X-Kzgw@sdP!S2-(aaCn63CQ&3ouPVyFT__!K(isyqB|}vbv<<#I!E*ExZ=8=B{k6!H&zx(q{}m2rrZ5% zHqAmX=imn(?1Hj76)Cj<7s@{v=~YwHex1f?H3g~-yPq&hu@sI$vo8j^Fw4>d+}R;` zwr~h3qag_HrufYvAxR&}`Z*T&;yd=p-vSGDtr+%0r#&N{lFtk}DNymhNhRo3aI)O? z2r?+X=(w z2vYJCEP;!Lb_Iak8bqK=VVMwswHHwjQ1)WE@RYh5H~9m}c_ zPGGlVaXu42?ICr*QY=}%( zj`=DmS_`#MlraAXyEA%00fDF${4aYqW&N=f_W8b3ff&}`FL-R>E(Io>I=G3Ll!Pjg zZ0}`UfwOqr>$~L`mK-c2{bt32U=OK_sUozT76b_(@SJmXc}R_=j5@#9Se~M1tO%dN zwd9=Tt;564NOLb)1^G@#Mhe$5ezFfJG)4C_841!X-JHOyRz6uYItVF2Y_VxBO8Cc$ zFrJegZ=k;Z4-l^wqSPgC0;H{F*yJ=$xUpi`MuALjwjB;o6S-WqCI(FZU(Tr z@6VNabgO8nso@4Pg7i@_ns_%72_NfNj8w8Wl=^k9>*a_~@TnF4nXCD4iiq^=`JuTPTZZSW>W;%_g zV7EFnW@brm77AnnQHnfKznt3Y^ooaT=BX-;XvEMkRtE>FN4CF$c(&~D^H*>XRg%Hq zb}CccU2=VeDjV28so=00FDfRpJ4op$_4s{mV!7VQUf0nBIFHmDQ~K`9AK%kWiX+{2L@$K7!!#}`8`k45-<=tLAUx~1Lk<-6Hp zUFc$^oT1$$?C1RnZ#^{Tu~_@#zc@O+Fp`m^NYchY;*;lhMh}>mbA0^sd{dsoFzZ&u z4eUBma<5)9>&0I13)-rxxvR$ORh3V5n`#3LY2Tv_UxZJ=9HywpbH!5CKlr+YL*|DG zX;s|^V<*Ci!VG{1Y=Ls@%iXznk9T0P;AJh02(X8~9qTZF#t!<@s4-%Lfi448PhWoc z-_o1SvmJvEYw`MP67`Yxre`bd<;$$tTJs6A6H{efVxH`7S1wgQ71Q_UtL9$ZHs<7& zBZr-Drz6NK)zs2N9Z6Vv?R!%=V$RWxcU?h`5wG#jTd&Id5~sye^X~4q!N#p(%eNzo zS8_h>;n_ZbCQX@;zfGJW7Y;q&v&S8)!n)}r7-2BFs#ks=87dMZvFBSHk-Tr?-Zk*( zgKH7*@+ECXUp>WG%XfMx!FMBu6RT|Yv^~lzCbCI?_sXOqJN7bW8th;@VY*>UWkg) zF0NGd{!y(&oJ8|RQ5mcKV6g?j-q#fE7FCgB*EnEF5^*bx`y?99;C2H)s`!<;9bI!d n`c7Q=U!(17j99T&-~;J+>IH)rdgJrw01AqllC~mT9uo0CeRwWs literal 0 HcmV?d00001 diff --git a/img/brave.svg b/img/brave.svg deleted file mode 100644 index 8206e81..0000000 --- a/img/brave.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/img/bytedance.svg b/img/bytedance.svg deleted file mode 100644 index 7b7cef5..0000000 --- a/img/bytedance.svg +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - - - - - - - diff --git a/img/ccbot.svg b/img/ccbot.svg deleted file mode 100644 index b2f4567..0000000 --- a/img/ccbot.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/img/chrome.svg b/img/chrome.svg deleted file mode 100644 index f8987d7..0000000 --- a/img/chrome.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/img/chromeold.svg b/img/chromeold.svg deleted file mode 100644 index 8160631..0000000 --- a/img/chromeold.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/img/chromium.svg b/img/chromium.svg deleted file mode 100644 index 9d3bcf0..0000000 --- a/img/chromium.svg +++ /dev/null @@ -1,144 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/img/clients.png b/img/clients.png new file mode 100644 index 0000000000000000000000000000000000000000..fc6a01d06805e4c4f9087de476cdb8134148b5b7 GIT binary patch literal 15217 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 Q|D79^5|bCL6*dh1KUeYp)Bpeg literal 0 HcmV?d00001 diff --git a/img/dataforseo.png b/img/dataforseo.png deleted file mode 100644 index c4da2c37a450078d81ecad51c7208153b2ee9367..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1198 zcmV;f1X25mP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1Vc$gK~zXfl~#Rd zl~ox3J@32S*(RkFML|Q$z>hn(U5B$}vkxc~1RG*tP%!5zX#_QhvV=&8B!U)w*xKli zzWhkn7iCnWrJGaS=5FdAnYSQ6NK@?Yw)^qk)9*R&d#~^2#Qcrl&hv53^PJ~7=e(N$ zP+B-8w?d>8UiOGleOgsl9o-EAB;Fvuj;uK+1#eu_yps-o3oQhOjy$#h{!g`KbGuvTSOV26tk-u*-ntV;|x zYxQv4N)fkows_e?hW&2i;to4WF*X5vY<}W+EJ$z*Cp2=bw%SE7t*oRoQnApF67;;6 zeZ0^X-!;t1&!kf)zddnut@gTzn`d>nu3Nz~l2@qC@~uTAxo$p_9QG4bb$`xbsmdXI zX^gk>_xS360)0YobJuX##Ma#JTZ-6{7+$qPrbWBw(b-Q!__iEi@J0q7QHAZB%bh+( zF~*%~llGHuGr%G1kG^*`E8a~ps(OGd+Zl5h`~fOsuc9$ehk~zU@VyitC+o=t==hbY|?C%Uo~kWcSpD!G$WH>x(wSxLwvk7)VaMA^gP**Qvo~Hh8Y21~04b9mGcJ zttwv%T+`uJ<4KisLwJ$HI+X+b;p7c|(Tk^~tm9pQ6Kv00)YAq31RTlbVZS{J>Wjwt z4?C>G|LheYxH~g|S`{NT7~;GZifPryA;kdAWwo$xfotyIU|UrH*Y0#UX&dG6XP}g2 zZwO>f@&V`Q{nwr9gH&o|^^sa^rfk74i?)eJT!dEsnU%7G_>?r`_>Og622J^r!F)vV+-ij!6UpU@;r znB+8N+pfwR_y|q~Ur`3f!%KY!OY6+%F`wcVGOM=BAVVg&sWM;np}`fl0#bJ`RWta% z3Hix4K{bPj(z%S{B622qquPl-N&VkuC$C~p;Vr!JETqkT0}25C1Nkc3J`W1#F#rGn M07*qoM6N<$f_tGmUH||9 diff --git a/img/ddg.svg b/img/ddg.svg deleted file mode 100644 index 5721e8c..0000000 --- a/img/ddg.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/img/ecosia.svg b/img/ecosia.svg deleted file mode 100644 index fc60eed..0000000 --- a/img/ecosia.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/img/fileview.svg b/img/fileview.svg deleted file mode 100644 index abac089..0000000 --- a/img/fileview.svg +++ /dev/null @@ -1 +0,0 @@ -View only \ No newline at end of file diff --git a/img/firefox.png b/img/firefox.png deleted file mode 100644 index d1f0292486dfc1460175906e5e2d619e3912d6fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3012 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 R7xkZShNqv$={1qc-vI&p!bt!C diff --git a/img/freebsd.png b/img/freebsd.png deleted file mode 100644 index 6305f5805882ed164dfcaf6656bcdb86a499e248..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2026 zcmZ8idpy&7AOCG*tu*A}V3Z6yNE$PjLo(aka#_xjG)E$vTUKt7Yn`wi*F(BUuF1%f zYZ1-a6H0Qa9<9u6OD-{8n7d~>=lSRPyk76``~CTR-rvvX``?#AaM6~aPvjE9A@LYtUE0Me(YiML>t`;~`De*L&^>hqybkql6l0+In zfTRJCL^(;I_K)6vjV=iCqYja1BM=ynm#~)vfvHkI>Om5{9c8%yFeNelkNNv@r$^D*k)w_D1RAzbEBM^mc$HbHP8H?iS_}_0KIMGLmjYl1Fylw7sz5sOD?}+az&|9jrU%EnuHFfbgt0aKbx}(Z}(Xj^+jJw zWb@;n4whMt@U-#4pcIJRNC`u3FcV8P`%OyptI!_Rh>89P(C8xPEEpRQ2Mc zQ|*tp_UG4lNgp(gIA>zLI^nt2#K^}EdUis){?5qHfH(wmobfz553Qv@3F&Nuy%(+YBZ$g#}5WXQJ=@ZOr z#0NuKfR#=FBom)!b-NUfv5+}XXg4u<_R+?!ssfL9rM_S0uM&l9*Rgdqd-}XUK(C(p z`AJ;}&quSzfl}BRA~y1z+e_!SK#dQq&3O*$bE%;w5ynloqZFBz&w7=K3Cm11!NC9F7=6an@?Lha2uZt6Lp zRD-=d$CS#68qNu_DIC8LI;=(`N;7;3oWeNpFcv#Myn4{!5ud6W?Kq|ueCp0*hWfol zu}xd(LG#1#OSN*t3$XI<29J1wiqr{D=jj_4th$A8e{Vw}7-ZmaqAYl&7v|jS8ygGl z6_5OJ-&;yq_6YtBe^^c|da(BPRiW}9cnH?@j6#V^q5PSR+P>RRvwf*_){a-aJ&Lq! z6peVxrU`$*Z{QObix9;i6jQ4nAaO1ewI2t5{;v1>+<0^duTGX1(mU~7K)RkXUd6I6 z5gqXC8cE)myrjDsDrK638B|Z6vw_Bv!8EtDwzh0G1&6xMT_Gb_&-D-=e{VJ|J||Ri zWKITDbSy@55eUL$&5&=xD(Yo;eQ`clTNavMbF7`JD?b&v(>blE;EJuYVYg2GvX zL1BBCLX(Bdy1!Ulan^$R1*u2KOk4L4C)V(xOOXsNH%I*cz;LhF53WyC=lG{4C82@`kUNbewRz zS^ZO~I=f4IEiJ8{9G=fc?Zu()b~+pYE9C$T}`xN$$g=& zu3gHbFW-7QkonwvPrrVll!`&s5bQUzM@Wt_b#8emNM(v_(AGNJRpZHvu{3^iWE7Ka z)hpsP2EWfQ7v${Fuw`2J%fvA#es4*0ve?J+Ew0^O<4AOg)7p*c&#KkB3dczHGK=H# zXTuU#>f5p?0aPP)dd3F(JifKY%&rzq)#6s|_jk~?Z%@NUT*UrsC*vc3YuNugB3XyS zJVhW_f-8f&|I%f5HnR4|8fwd7<_CSdO7As`uPv{%Q+Mp+XT)BEz?CTk6e$+z?Q%1q zaGsy1P)#VmQz@ipQ?5puN4Yc zQ|skpK*#m7bjB4azOq*l zMK|g8uJP8b6ANxWR_nN!>8H=Olq&yS!Oy~my`=43Y-xYd6^?60e!IYN3am4YeJ^xt jTbf~Xe7(1&m6Ql9G)z^@s0lZ=KP*S0D}il$`tpAPbJ>J} diff --git a/img/google.svg b/img/google.svg deleted file mode 100644 index 9004205..0000000 --- a/img/google.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/img/hive.svg b/img/hive.svg deleted file mode 100644 index 98c9c18..0000000 --- a/img/hive.svg +++ /dev/null @@ -1,105 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/img/hmos.svg b/img/hmos.svg deleted file mode 100644 index 2a553c7..0000000 --- a/img/hmos.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/img/huawei.png b/img/huawei.png deleted file mode 100644 index 89f3e5acb90395b1c808a8efbd48c702fc3a56a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2065 zcmZ8hXH=8f7X6Zth!_#+MKnO7^dhK0H1vVcj3FopVnPYhM+hKIK@dqqItWq%NEHzY z1R<0O2pBpHRdf)+K}9J#(wq!=!S~*uIcx2^_dRRhd(OINtxLt(TOJgW6#@X@AlAwp z&u8g92*UX5eE7L-003R|F*Czq&CC$E;2^S(zZU=~k9ZJ?c&xfIheRS0IYVkHLc!tq zq@-j#@wX9n5Bnv1fZa*V%XM{~mlm0a5W0Xz7doH&!IKd`7@C|Xm90DEvb9k3=k^g) zP#xtH9L9}RLoxMbtazY>iTAflMPaaBafC}tTN%*33NS2au_<82huE1AZ`o5wdMdA>|FpHUT}*xo_wGEE%~fH z9R6f$m&be3%VuNp;@+(#@OZbhe(-o}?!`-JIDFqXz>?>kf78h;p8wGMf37Juw*P&6%gca zpnxn03V`^^nh&}E>AjIEgCIZi5Wdy{fdLUdU*^N-uE5W{FJJG)qf7w!$T$6;|5X$K z13=n7K!ESmKB=n>D*o@SJl@a4fKw>_fKa54Fu#*>thoun$|lCq#h>6Pe&xd;<)~LK zruce=Mq~M9WxcBUgDUlcCO#$+=F!MR@g8$*(l$v^^!|DY_2D|nPFz%CG}g#b-8>qg zl@en!5X|nJFy9hRV`Em>?C|HgMZ@q_xYnZmWq$j9mqsLbN+dJ>cjrtbnb8@zi{V z4pLI{u%{U4`&`an$AuD1tIh5cw!3@Jsl91+$WbZjJ6Ih=twW<}IT*tS!XT+h1qaoD z$q|R`e+Ch_JgsL62yNr-GzIR;;V-ik{oS0E;S5^=zdr6@lCKON9B4Q?tiIG#f$9`t z<<+G2L)~r|EB1cSLfd`skzh0y;*~e=dDAt+FQ+>l_D5$cuO?T?L&!8{Pfl+}>y&i@ zvc^|F4JH6^>?RKQKXQroDj>DnZgk6-`ascZl{)n(# zPwfMOi^JW#NB45FQ({LvY^TNXPOb=TKcVp#f+Kzvl+CCk%F{rFX+kX2*6#LjW^@Xp zGTu~X!^C-otNZMVwc`){j=0{Z(4jw%4WN-DKqhw40wRkTtXlsVbNpdqi^bz zz`^o^Y7Q^w=gDO|uZ%lv)>A&V&3^I<{Qmc(^fGeIc5)Y!8R2-N(%Sv4YaG)P!%n)X zv{=|~e9UA#WrL)VBL-f+mp*ike7vFZf}*Qc^DnTo?)E2~6T5`Yzfr1xjCZ$Tvd1pW z&!>U&VaRI-j@_7X$D&SrUhvW>C-)j4yq(n|b^FS~#TuM+?rb$dZzB8051KDr) zcD5m4yMJD1Kx5%|rLlHa+8>MH(~YuDzrN|N2~ao6zcr>e-=c^}H8@JnsLjIJ8S3p2 zCGv-Rn-#{RHv4DAoS6N25err_-u+ZJv2#x>R6;{lTbYV$;kCIogqucS*Cghg1xwfy;KjnxGeF zxe7`?OUA9e2TrAiT-!vtX)m{K+32koLL_+4aAsw1MkrU5t`&)0U330q;J4A!B=(iD zq}jmKh-QxQ) zT=6@^8g`bfn_!ua$2ir=d^X8R=|bd}4I5mNdK&|8_b9Oc_;DfhsrZ#`!CT8TfgF+b zbQxjw=GQxnu%}zKg1_UxzUpR;Au%!^yq~9-UsY{QGo&@{0G*Q8G3^vOq|yx5v?-ly z-|FMP)$jUs?qzD^Y3IZ&LUI#DFVd)%t}3g>n5fcpn@BM}&&gW${-rM{#GuALxHo9! zWZDpii>nvaIz9KrbwC5S99Fv?-9dTy#O;fvu4SO>*gJu!lY>*z(|&{9rl%uHuFfCf z5mz(%tG*Stbd2f*tu4+S@;@Wfg0gr%@FRY#zjOZvL7&Fz6Q1D8-~BD4x>_UsQquI! p3Uskjl)mk|6+GhnHzxqhJx~!zr_y_R*n8hM*23QWsVVXHe*hX#n&$uj diff --git a/img/hunter.png b/img/hunter.png deleted file mode 100644 index 4180226f5fd3895aa3bc4494c7ca4614cdb7e02a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 952 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 \ No newline at end of file diff --git a/img/ip4.svg b/img/ip4.svg deleted file mode 100644 index cd42250..0000000 --- a/img/ip4.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/img/ip6.svg b/img/ip6.svg deleted file mode 100644 index 36f09d1..0000000 --- a/img/ip6.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/img/linux.svg b/img/linux.svg deleted file mode 100644 index ad51cb7..0000000 --- a/img/linux.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/img/localhost.svg b/img/localhost.svg deleted file mode 100644 index 3fed84c..0000000 --- a/img/localhost.svg +++ /dev/null @@ -1 +0,0 @@ -localhost \ No newline at end of file diff --git a/img/macos.svg b/img/macos.svg deleted file mode 100644 index ba53ad8..0000000 --- a/img/macos.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/img/majestic.png b/img/majestic.png deleted file mode 100644 index 4a1498da9cfe9eb54158607782909dce38d14213..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1914 zcmaJ?Yfuwc6kdGsDq%zgi&VEup-{{l0tpEivVoumBM*`Kz?iHMA-gfVApwIZf|j9F zg+Y9vfLcatp~YIPB@~c421P{Ff{2eQiquCfMN~lO22uN?bZ73~J$JtEJLlYU&TNh> zBFw?g)eZmvhj0lTN$#^P%Vrw+zM~hsBsVKOGAsnBY;o%)jVTF2sSp6FcGwTgr;@g< zMiPeu0Hx8gtj=Lal>jhVsES@rESE0kDKIrnuEf?NG=o}0q5*&(Y|zLRNeBV1MG{n~ z0Q$404gyt50Tk;eWk@w5BvB>akk^mA~Jc7%mGEjtR5zwE;q$(H;2I$YFaTN-MuM*+1=YuQ;i$!O! z=}ccL)0fBa=doDe_ydt1L6EOiuH!|*q2nG&O8_Mjgoa0_>-Bn?o=wBF33Mix%cV0| zbQX(BBB*#OO2`dV6nB3kGA;unxI(Ma5Go7>Ewb{pn2r!YWYBN2QET35qxkrhk(Wm| z$Tf5(jbX{|El?``f2dmh4viC$$oruGQy7m<)gbgp1jlq*1wz8zEv_^?krt5?m^K>2 zlHXpaED<9xJQ34?EH;e|dc~?xC8o!{#|Tm>FC4`QIjTUyVF5%+&{QfV4;F>`i#Y56 zksrs8$rOtMgbXn^gyY8z6*9$Q4(lx!#uPd=f)a1J%J*FEgxs+zSxUwy-H`#nh*p(? zC_}ZF8XQZVrevcGAmu~V|ANQ+N@*V7j3-CQ6j zISg8|>kFZgN8~V_35SKzl0_9UD-zveW{zInqvaf3iL$ zp~pDF4xH}ayDWF8VK295boB4nMR?=$&0Q|gZTrE-^IIQxgr}eb+Y6^YuMRlvE3W>k zcUXSKC6>}X_)#Y%KYMnQbxGgZLMvSzT=#$&kO(SD)}Iv)ebKTbmS*3#t4LS9&E??o zmi_@GUwj~-cT-#JXt1o#$>YX|c~jJ-4^O62{U7Y^t(;fvTZk=l-Zn~i^gFrtw___R zcHEPd`qmE~ncLb#aliH4aQP_TWMggso@F=hOPa3=#9;iwYI|H*Ky5_JsFK|ozYM|ot#3b7%#mCsL zgD0%ggMb89R@VZD0Iw!bQ|V@Q{-CqkY}a%FRwXSek?4S0S>)vHX&K4Fe2j^|Wsed_y+g`R(>ooe^yCues@22M;A}cBJ%P&vC#pzs9GI!XM39cZV~=gaMIuWqK;S@rrC$jbn(T;PB$F zYsJgfZ`_tmy&0N(v!_bnJ>|uN`XA1W#Jfq{XsIt7=O0SH7ji2|w#O~4(?fsFV`gWN z)6y;JC2g*oh?ETb$L)=>MXRRWUh}b%b1r+heimF(aALm?#mleyT6>z;_3}_nt@zPJ zbk^znYm(2+%&h6F|LHrE-O9e!p~&4mbo*C=dDKtzRS(@}$Gli1u1Ptr>57!L+_sOS zg#JJ+`5C{HUSnKp>&*4KYxGeE9?GEDybk`u-S)IS&$0c-f)AS7^F^%AyS6T+#apj6 zcb6?Or#lywx!(_PCwBKowRQc{Q`B0wPn&h3&*q}JVda-BN^xLuuG7#`RZ&*5lTEF< zY~W?wulZ3nk7-X?r;KS=vkvO~7o+M8sQ38*^S4^hGjoNSB@vRSFKT()7d+b6*ie}B z-TD_TAE)rM>lbnML~F|Lmv7O5-&ZxTHDykHe zKk-^s({+^ZVtNu5pRV31@M)SRrEdCZJ^b_=G(KjMI>YJpRTQ;!Rj_?2^=&R*=E^Yqqf+RpSmC3ZNt-)eYj X&v{ep&eiOXEI+_-aRgi$vL^E%DC+ht diff --git a/img/meta.svg b/img/meta.svg deleted file mode 100644 index 4fc6a72..0000000 --- a/img/meta.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/img/msedge.svg b/img/msedge.svg deleted file mode 100644 index f56c0f7..0000000 --- a/img/msedge.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/img/msie.svg b/img/msie.svg deleted file mode 100644 index 9c71290..0000000 --- a/img/msie.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - image/svg+xml - - - - - - - - - \ No newline at end of file diff --git a/img/netestate.png b/img/netestate.png deleted file mode 100644 index 8bcabaa0c04f294a72b4098bd9ec09b48073ac95..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1783 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qt-49wP6v-9O7C~?S5nAKu~iB;^)>J+ zYH@N=W&S0onb8|oQ=yarR~>x*A$ zZZ2GPaY;}r!qHd_E)JG8yuxejlE6=>*lEl2^R8JRMC7^!2%*+%kCl@D2150y569Y#R zLqk^+3jP^AzBm>-f^`VZk(FesbQk+B56Ic|OpnyCZeRygH z@!&ZkH4m5#ih$|;&AU`7U^a5~ba4#v@LoFA);}arpzZm+yR0IuO|yw9^3S+Co=iYtlq@auQ-1soV~Tn^!4dAd%e`+ z^V@V|H|aZWE37>->516s=Z^Juw^J52u4XXl*hlFdSzLY|V7<|&?Vs8pDLdDiWzMG|_8^3+orF3R#= zdh_;Z;1<1UrORrSGcU?&xLSEWt$26iz02!^VSJ|3j=bM?#%%TFG+o#Me2L`Ol4i?smEbEjB!Y^_=`>rl*WebW5nbpKm8<%b*PoRQXaO0w~7t%j$PpI8+pY)e=o5GFA*EzKdAM9CCYj>lF&Vrk0<{>O1*v(l_>i$?`06TD+htj=|H_&t;ucLK6V%;;2&q diff --git a/img/openai.svg b/img/openai.svg deleted file mode 100644 index 89150e2..0000000 --- a/img/openai.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/img/opera.svg b/img/opera.svg deleted file mode 100644 index c038666..0000000 --- a/img/opera.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/img/perplexity.svg b/img/perplexity.svg deleted file mode 100644 index 4bf985e..0000000 --- a/img/perplexity.svg +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - diff --git a/img/petal.svg b/img/petal.svg deleted file mode 100644 index 41e7619..0000000 --- a/img/petal.svg +++ /dev/null @@ -1,110 +0,0 @@ - - - - - Petal Search logo - - - - - - - - - - - - - Petal Search logo - 16 agt 2021 - - es - - - - - - - - - - - - - - - diff --git a/img/placeholder.svg b/img/placeholder.svg deleted file mode 100644 index 5c162e9..0000000 --- a/img/placeholder.svg +++ /dev/null @@ -1 +0,0 @@ -placeholder \ No newline at end of file diff --git a/img/plagaware.png b/img/plagaware.png deleted file mode 100644 index 55f4ce7d5b90d61b8d525dac5b9f8da2c00006b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2029 zcmZ8idpy(o8~@H|C=MsLZIW_HD|2VdHRi{t9e0-7PcGYH7_(J0;;@Kvo!d|n$4b*h z6j~9hWQ970R7`~8oZP~}na=tB^Lt*e_vih7p6C5}p3i@uOgEg9oGeTh0023xGsZ*A zYTJt!qMYL0pRxKoqvT$iF27)XM8*WAop(r#2FvW z7Z=s2j($|nmT5f6cD#^A%LXV zX=rR>2)gpm)a{K@SN@q)DAwB{A)YJo!|8!WiPgWij0_F8yR(I}OKj!^CIIYUV=+g) zoL$p>99a^b1ki&SNf-F}Jw z9AvBXb?>s1Wq!L{6jieC!Fzvu>LZIvXYD`XDpw@saDBS!YvFVoJ$d<^f2(HZ+5GZ% z^vU<}j}irR0W{xqU$dst$<;K65Qtp|cjtNO=AOczorUtEm6(d_hjoX;-6bm-8hs`{HH;75S`xa{F+2%x zhTtn1_?Q@;XrVo&@~-W5Ak~j0BkJx_>+5s>&#`0of>@;7<>mR0747p5V_CiTn&~Me ztgC>1@CU#j-%{$u3j~wNs=tz8hO}RX?EGub?i*%(wmX5S^pM@a2-1mG8g9~>W(nr! z&h+r6zZ61^ZT8`A1$~YGy&*9}N4tAK=~ZCkxheNfQE4bLC_ozy!=c#}GA5m9`bP3K zsEpqpqV~tYW6k8Hw{dwJk2h+`CioArS%DAzI(-d#3T!2DF6&7bpNyPn=&6HEXQif( zC(YV0+Ke;}SE-vx+y_lHUdu~M@kKr56Cm4epP&c*;p<6}XuF!z^X;8DqV~%U2ZwjT zLDBPeZX*hO9wX?~){z;T;oF@WP*_;V$Qb0qmIA&+FK(~@bU^#r995NQj1XT%^hH26 zHo!M)bv1EpqJnGjWVx}G1jJ|axVfsT7Bi*g5A}>-gC@RoK|I{t4^kNj!o^Cntnwly zB^Zo*%kbfWfx1#A>HGtWh;?Sa^J2xVDieqsg`!pe6MdsDqXosi! z6VbPCE&UJlcQUM~ufKokwMfUnp-@tU=RkCHnJ$B)?(AvV!m!@uS&NG!gw-HoW1Fs} zHIv^FTPX8F^P0kCC7cRUxHda}H+&kdSf7Em_K#4U7}*w;7w-qak~qA8+|(xC#Gdbp6O2!9Pz%=7=9h z#bDfZ6D9g7ZuPE>;0z>V!BX$^DI=c6sywA{-h$dbo`rSUPa@qVCM?nP4kb!WhWFZi zZM=WATwMpl>8=ecCmvqsH7jnhi067b@3hyszSQ7$_9Gu1F_={DjQ-3)1A@@D=42CcPrxZIwce6`=fI5{ zPqLv9ro6_d(iPjN!)F&Y@=DYUN*|gb&cZ9WwhqwRZfEKXl5zNga&xlpU0`SK^G`j4S}OBX*XAFa z)+=;%U#j!JuQVVEPI?{?UGVZ%X(X<6(gg9LL8qB;w%+VePU%Vw%5y3rlLOv5k6%Gv z8^S}W+EEwR)(UXg=SQ;g3=12K`s9^({F52k)%c-OpWaPlRN``*@X=SUkY(u{9JAMJ zuAWlFdK5Zd*?d1BrPzGp+vFryIM%7GeSmN)Jv% z{JB{=(?4)y=%~*HHQIlT#8p^dO7_pK?Yyi#_c}~>xjeLvj1=D-?xs0rT_o{ diff --git a/img/platforms.png b/img/platforms.png new file mode 100644 index 0000000000000000000000000000000000000000..46a33b76eb29f62ce3ba1a2b4a1f50dd76cb23b7 GIT binary patch literal 12169 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 ith8A=U4>@673$ml)AFj#viG0= \ No newline at end of file diff --git a/img/robot.svg b/img/robot.svg deleted file mode 100644 index 6070578..0000000 --- a/img/robot.svg +++ /dev/null @@ -1 +0,0 @@ -robot \ No newline at end of file diff --git a/img/safari.png b/img/safari.png deleted file mode 100644 index fbe7f7ff6ebc9c2f5fd634210117839eed4d7b2c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3236 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 diff --git a/img/samsung.svg b/img/samsung.svg deleted file mode 100644 index d3314de..0000000 --- a/img/samsung.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/img/scriptrun.svg b/img/scriptrun.svg deleted file mode 100644 index 7a87cbb..0000000 --- a/img/scriptrun.svg +++ /dev/null @@ -1 +0,0 @@ -script-text-play \ No newline at end of file diff --git a/img/semrush.png b/img/semrush.png deleted file mode 100644 index 5e15d0d2664113ba02204aa6b7b3f37b09c30b2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 745 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGX$^ZZZ$^lrduyz0d0)9zEK~y+T<&;ZE zRACr~pEGmLakQE7hBz^nNDD2qG%O2h6DLyYxRLF+aw#U)z-#c`&g%uxWyfmQKe@2F7uw z;>|(V(KLbqI()RZ5(-jS!rsFS&NI}Eni5$aJ5gYm;%ZJ_kUJZObPRDilMD}bmG8sc zs-f!<=Np-xq}NCFRc5BRQbu?Yn<~ne!qz?bp3(9KcZysru1qhUEJ+dE=l3MVy_K=A z>_5VRa$Y~i<7Iahf$k_^38aV!5~)8$-9_rVQ^;ElDok zHSujoddX=Nl`|9h1OXKj&`?9(9#oayHgu=-LFN=EF^5_LrB%3+Ek`V_Jj2)^A8yNi z#mOozQ+k3gJ+wX`VY5}WVjva#ZEP&#*g1;!$?T&FEbytF$x$-1$Sq)Ej2oBeZ$i(A zzF+nKNRdAUe;?kXlvI#kEIa6Oli-l4{g|cG$BXNXyv31iWw!=sN#S|sdu3&EA*ox~ zkS?cYw43o35_3>pF^bS{K`|L2j0KE - - - - - - - diff --git a/img/seznam.svg b/img/seznam.svg deleted file mode 100644 index a95f053..0000000 --- a/img/seznam.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/img/spinner.svg b/img/spinner.svg deleted file mode 100644 index 75c5a25..0000000 --- a/img/spinner.svg +++ /dev/null @@ -1,168 +0,0 @@ - \ No newline at end of file diff --git a/img/tizen.png b/img/tizen.png deleted file mode 100644 index 236e1286309169f1b83b4a37f5b30613e7672706..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1203 zcmV;k1WfyhP)Px#1ZP1_K>z@;j|==^1poj7a8OKCMI?*SC5zDjhtMsJ(y7GdS(?@siO>Lq&tIL_ z+vW5B|Nnlg+W>~p0EN$!x8U^n{DZCBaHQG!`~8Hj+#`$8x6SE+tlR*B&Kru+6N%7N znAOtY@s70LZ=>0TuHBNh;Gw_cl(^x5tlWRA+cuBV0EW+tvfk$I_v!EW*5dNx?Dp*P z`QhsJ{{H{w?e~YU-2j8n9E#B(iqRsA(YMX$*5mT>_WQHS=P8ZS>G1gR_4?Z7^Zfn( zwae%-j?yuX(gldnABxcch|u2W^!oh%0DjHC)9d^F{=3lXyU*#_F(ExwWin87^kJ4?T*~{AQPnOgIh|pY|*1gc`ht ziqWFK)lu-*9k{oUyFugK?7m({`3>$1w{@b&sel+?V?>df5l4T;bpi_sB@&|aO_ zTAS8doYvLi@(GC00D{iy@c8=t{o(5M*W&WX*zH@J)(wcz9*WWF@At~u?mdyy;OO-d ziP0g7(XGek=%2zZ=~4-h|tmB@b~)t^Y{Di^Z71~ z(ww~FG>+0ol+;d_)lZkzO_tR;kkc56(f-y^5dZ)H32;bRa{vGi!vFvd!vV){sAK>D z0nAB6K~yMHV}JohCT12^HYf)fuyb&7aq~bq2*Ak8$IrzjfGNQwD8$9ZC5#~&M0A z9}pPC70eqF%Ec8H9udh9#l7$i|rnpBovUZDnJbFr|4U0MlZ2US&@*VNY4HzeqCaWytM0wqM4 znp+ZD+uA$0I=i}idi(k(Xb4RN2aSlqq{&l&nx;-;(&myW<(?iiVwprW z>o-8fH#%to`I`#4Hmht&;Nsf4Z97!LU_kkoP>}Lmh zz~BJaK_-Z}@u9; - - - - - - - - - - - - - - - - - - - - - - diff --git a/img/vivaldi.svg b/img/vivaldi.svg deleted file mode 100644 index c3c211e..0000000 --- a/img/vivaldi.svg +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - - - - - - - diff --git a/img/win11.svg b/img/win11.svg deleted file mode 100644 index aaf6a7a..0000000 --- a/img/win11.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/img/winold.png b/img/winold.png deleted file mode 100644 index bac4773fdc6fd61bbc294a2965d777f348b2c787..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2683 zcmai030M=?7M_GHEKxudRH}Iq11?zz0ZAk*LVy5)00BZ#Adn$M$YL^(09FF63ls}aUU#!sMyczM5dhDUU4 zA_PfkM502WASfIN5}AN#Po+|cBr=gq#={nPd72pFDe+?Y0u99^hZiW1mkFhiP$I@? zIC*iB6o`(+!Z_wFIj9uAV;9TcmJbU-)F4EA0*Uy(IV4Q@jJXE+$XuEzfh6)oiFB%f z4?;}AA34JEecDCIlYYvW#rogoBGCtB$RS25EW}$;Kgj8y0CG;66eNa#a!HCT9%Q6~ zVrYR@35_l^wonNsbG?KjP%MYlrDMsIe}R#o0X-$j5?Ls`s6aZ_UhAV#j>Z)61Ym@a z4<$}O; zcM#LllP!}Z2$Nw<9^$hC!(@0m*;AdI@MOYd1h{E5*jJd4=EZ|xD>8}fh$m6;BnOT? znFe1J$0Z~(jYQHiYpvnEz~@1{|7WjR(HIxlgTb2i#yot+001Degm7yv74>iA{5Zp%fg&thDs2UY`BEEf*@oUiLP& z*PFM^tfm-kTU4=o#`hNAN4J#YB*qH6i_M#d%cW|ZrA33|^ThRPRv>4rg^#!X>+55z z&Rt`_UXQ7?IaXU;Z>^y1idZ)k-*9erOY3@@)Nd8VGi+4TEkkqfU1-6SkTXU|UX7Jy zd2Z}0>V->AZf;$yM+s+cxA9SzrIpXix3Z+;7BEf^zPZ!zc;s%eU&`U>kJTpkju;F^ zu@}!d|FD?1b8FKm%5vZ8b)$fHAA=a~_`1TR*aC~!a?TiXo8D_DeQGTV+gCN+xdm75b(x>^hR`utcndUa(!r69dL@1T%LDisYD*=@?-8t1v_Ap4R@EJ9GUQgD2_ zyfnnGaHX~y-)wI`}o z4-v)GUZ?%_=FM#qxtUdu{AZ$G*=GCZ2ey@Ks6lR~L84S7u4L)Jj(B9$G)uFj9K)DV z>uQ#M^HF)^vp-gr)7GdTNCk=06m+TjbwLNB?SyCkNYml@7LgOz@k1wFeL~gSZfz4R zW_BeU&*Yr%{=x~Esr1*EhWBKso{gte#WfjQ=qxNaE5bWpf1+D3Jym%XX<);RNw628 z-Cmxp3g$Bg`hJ1{i!j`Z(6c>0hhEVlbcgM(ne?)nXWzTBI)kuXH(9qG`4lmVRxmQ; zGvY^ajB*>sT;*{PQzY^YHj4Sm3NW*<&KTqmPc(B(eSZnQ|BBWjE@EC)8PczC?`=9&a>(i=CT<5yV zsDhEp%so+611|!Qg9hnf(Y!J!yr%}`=x2Kkuu?tEy4}!1SZDkTr+D5YtBDZ~f{naU z-PLf2QaDSJv7jQWziJEldY-h}@9y|2ne%T?bv)`$Uf=N?IUnKul$+OUdXjvZ(%vJ+ zks=xvCxt$Iyno{;VpEfgTYa!~XYiwltvA2%v!AcZ70I7@c9_ySQ2y?>zNpDz2d&i` z%PKEB*ZQB5i%a9$Y8Zw1AYh>7tiF9u#pbT?FiJx?>Th+>Zfvv(+SlNcVb=@O;(ZXy z)=b4su|4owg~jc!u)CO-onGI66!mKM4ixnuekq@ocjka4m*T$1_`6znU(44WW`@=V nrH1?NyJeZ|>>IuL#=KF-DwAWz_sDS8{AXk`0==qM#Ag2&cufge diff --git a/img/yahoo.svg b/img/yahoo.svg deleted file mode 100644 index 488505e..0000000 --- a/img/yahoo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/img/yandex.svg b/img/yandex.svg deleted file mode 100644 index a39c923..0000000 --- a/img/yandex.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/plugin.info.txt b/plugin.info.txt index 3292553..f1e2eae 100644 --- a/plugin.info.txt +++ b/plugin.info.txt @@ -1,7 +1,7 @@ base botmon author Sascha Leib email ad@hominem.com -date 2025-09-11 +date 2025-09-12 name Bot Monitoring desc Live monitoring of bot traffic on your DokuWiki instance (under development) url https://www.dokuwiki.org/plugin:botmon diff --git a/pview.php b/pview.php index 2c5d48a..dbc4128 100644 --- a/pview.php +++ b/pview.php @@ -7,27 +7,16 @@ if (!$json) { die("Invalid JSON Data."); } -// select the session identifier? -$sessionId = $_COOKIE['DokuWiki'] ?? ''; -$sessionType = 'dw'; -if ($sessionId == '') { - $sessionId = $_SERVER['REMOTE_ADDR'] ?? ''; - if ($sessionId == '127.0.0.1' || $sessionId == '::1') { - $sessionId = 'localhost'; - } - $sessionType = 'ip'; -} - -// check if valid session id string: -if (strlen($sessionId) < 46 && !preg_match('/^[\w\d\.:]+$/', $sessionId)) { - $sessionId = 'invalid-session-id'; -} +// what is the session identifier? +$sessionId = preg_replace('/[\x00-\x1F{};\"\']/', "\u{FFFD}", $json['id']) /* clean json parameter */ + ?? session_id() + ?? $_SERVER['REMOTE_ADDR']; // clean the page ID -$pageId = preg_replace('/[\x00-\x1F{};]/', "\u{FFFD}", $json['pg'] ?? ''); +$pageId = preg_replace('/[\x00-\x1F{};\"\']/', "\u{FFFD}", $json['pg'] ?? ''); // clean the user-name -$userName = preg_replace('/[\x00-\x1F]/', "\u{FFFD}", $json['u'] ?? ''); +$userName = preg_replace('/[\x00-\x1F\"]/', "\u{FFFD}", $json['u'] ?? ''); // check load time $loadTime = $json['lt'] ?? ''; diff --git a/script.js b/script.js index 57bf98b..2f51c7d 100644 --- a/script.js +++ b/script.js @@ -1,6 +1,6 @@ "use strict"; /* DokuWiki BotMon Plugin Script file */ -/* 06.09.2025 - 0.2.0 - beta */ +/* 12.09.2025 - 0.3.0 - beta */ /* Author: Sascha Leib */ // enumeration of user types: @@ -21,6 +21,7 @@ const BotMon = { // find the plugin basedir: this._baseDir = document.currentScript.src.substring(0, document.currentScript.src.indexOf('/exe/')) + '/plugins/botmon/'; + this._DWBaseDir = document.currentScript.src.substring(0, document.currentScript.src.indexOf('/lib/')) + '/'; // read the page language from the DOM: this._lang = document.getRootNode().documentElement.lang || this._lang; @@ -33,6 +34,7 @@ const BotMon = { }, _baseDir: null, + _DWBaseDir: null, _lang: 'en', _today: (new Date()).toISOString().slice(0, 10), _timeDiff: '', @@ -242,20 +244,20 @@ BotMon.live = { // shortcut to make code more readable: const model = BotMon.live.data.model; - const timeout = 60 * 60 * 1000; /* session timeout: One hour */ + const timeout = 60 * 60 * 1000; // session timeout: One hour // loop over all visitors already registered: for (let i=0; i 1 ? rxr[1] : -1) }; @@ -958,7 +961,7 @@ BotMon.live = { // Load the list of known bots: BotMon.live.gui.status.showBusy("Loading known clients"); - const url = BotMon._baseDir + 'config/known-clients.json'; + const url = BotMon._baseDir + 'conf/known-clients.json'; try { const response = await fetch(url); if (!response.ok) { @@ -1024,7 +1027,7 @@ BotMon.live = { // Load the list of known bots: BotMon.live.gui.status.showBusy("Loading known platforms"); - const url = BotMon._baseDir + 'config/known-platforms.json'; + const url = BotMon._baseDir + 'conf/known-platforms.json'; try { const response = await fetch(url); if (!response.ok) { @@ -1090,7 +1093,26 @@ BotMon.live = { // Load the list of known bots: BotMon.live.gui.status.showBusy("Loading list of rules …"); - const url = BotMon._baseDir + 'config/botmon-config.json'; + + // relative file path to the rules file: + const filePath = 'conf/botmon-config.json'; + + // check if the user has a configuration file in their DokuWiki installation, + // then load the appropriate file: + this._checkForUserConfig( filePath, (hasUserConfig) => { + this._loadrulesFile(( hasUserConfig ? BotMon._DWBaseDir : BotMon._baseDir ) + filePath); + }); + }, + + /** + * Loads the list of rules and settings from a JSON file. + * @param {String} url - the URL from which to load the rules file. + */ + + _loadrulesFile: async function(url) { + //console.info('BotMon.live.data.rules._loadrulesFile(',url,')');} + + const me = BotMon.live.data.rules; try { const response = await fetch(url); if (!response.ok) { @@ -1100,12 +1122,11 @@ BotMon.live = { const json = await response.json(); if (json.rules) { - this._rulesList = json.rules; + me._rulesList = json.rules; } - if (json.threshold) { - this._threshold = json.threshold; - } + // override the threshold? + if (json.threshold) me._threshold = json.threshold; if (json.ipRanges) { // clean up the IPs first: @@ -1119,10 +1140,10 @@ BotMon.live = { list.push(item); }); - this._botIPs = list; + me._botIPs = list; } - this._ready = true; + me._ready = true; } catch (error) { BotMon.live.gui.status.setError("Error while loading the ‘rules’ file: " + error.message); @@ -1132,6 +1153,28 @@ BotMon.live = { } }, + /** + * Checks if the user has a configuration file in their DokuWiki installation. + * @param {function} whenDone - an optional callback function to call when the check is finished. + */ + _checkForUserConfig: async function(filePath, whenDone = undefined) { + //console.info('BotMon.live.data.rules._checkForUserConfig()'); + + let hasUserConfig = false; + try { + const response = await fetch(BotMon._DWBaseDir + '/' + filePath, { + method: 'HEAD' + }); + hasUserConfig = response.ok; + } catch (err) { + console.info("An error occured while trying to check for a user configuration file:", err); + } finally { + if (whenDone) { + whenDone(hasUserConfig); + } + } + }, + _rulesList: [], // list of rules to find out if a visitor is a bot _threshold: 100, // above this, it is considered a bot. @@ -1306,7 +1349,7 @@ BotMon.live = { matchesCountry: function(visitor, ...countries) { // ingore if geoloc is not set or unknown: - if (visitor.geo && visitor.geo !== 'ZZ') { + if (visitor.geo) { return (countries.indexOf(visitor.geo) >= 0); } return false; @@ -1349,11 +1392,11 @@ BotMon.live = { }, - /** - * Loads a log file (server, page load, or ticker) and parses it. - * @param {String} type - the type of the log file to load (srv, log, or tck) - * @param {Function} [onLoaded] - an optional callback function to call after loading is finished. - */ + /** + * Loads a log file (server, page load, or ticker) and parses it. + * @param {String} type - the type of the log file to load (srv, log, or tck) + * @param {Function} [onLoaded] - an optional callback function to call after loading is finished. + */ loadLogFile: async function(type, onLoaded = undefined) { //console.info('BotMon.live.data.loadLogFile(',type,')'); @@ -1389,50 +1432,56 @@ BotMon.live = { try { const response = await fetch(url); if (!response.ok) { + throw new Error(`${response.status} ${response.statusText}`); - } - const logtxt = await response.text(); - - logtxt.split('\n').forEach((line) => { - if (line.trim() === '') return; // skip empty lines - const cols = line.split('\t'); - - // assign the columns to an object: - const data = {}; - cols.forEach( (colVal,i) => { - colName = columns[i] || `col${i}`; - const colValue = (colName == 'ts' ? new Date(colVal) : colVal.trim()); - data[colName] = colValue; - }); - - // register the visit in the model: - switch(type) { - case 'srv': - BotMon.live.data.model.registerVisit(data, type); - break; - case 'log': - data.typ = 'js'; - BotMon.live.data.model.updateVisit(data); - break; - case 'tck': - data.typ = 'js'; - BotMon.live.data.model.updateTicks(data); - break; - default: - console.warn(`Unknown log type ${type}.`); - return; + } else { + + // parse the data: + const logtxt = await response.text(); + if (logtxt.length <= 0) { + throw new Error(`Empty log file ${url}.`); } - }); - if (onLoaded) { - onLoaded(); // callback after loading is finished. + logtxt.split('\n').forEach((line) => { + if (line.trim() === '') return; // skip empty lines + const cols = line.split('\t'); + + // assign the columns to an object: + const data = {}; + cols.forEach( (colVal,i) => { + colName = columns[i] || `col${i}`; + const colValue = (colName == 'ts' ? new Date(colVal) : colVal.trim()); + data[colName] = colValue; + }); + + // register the visit in the model: + switch(type) { + case 'srv': + BotMon.live.data.model.registerVisit(data, type); + break; + case 'log': + data.typ = 'js'; + BotMon.live.data.model.updateVisit(data); + break; + case 'tck': + data.typ = 'js'; + BotMon.live.data.model.updateTicks(data); + break; + default: + console.warn(`Unknown log type ${type}.`); + return; + } + }); } } catch (error) { BotMon.live.gui.status.setError(`Error while loading the ${typeName} log file: ${error.message}.`); } finally { BotMon.live.gui.status.hideBusy("Status: Done."); + if (onLoaded) { + onLoaded(); // callback after loading is finished. + } } } }, @@ -1443,7 +1492,14 @@ BotMon.live = { this.lists.init(); }, + /* The Overview / web metrics section of the live tab */ overview: { + /** + * Populates the overview part of the today tab with the analytics data. + * + * @method make + * @memberof BotMon.live.gui.overview + */ make: function() { const data = BotMon.live.data.analytics.data; @@ -1486,29 +1542,29 @@ BotMon.live = { } // update known bots list: - const botlist = document.getElementById('botmon__botslist'); - botlist.innerHTML = "
Known bots (top 4)
"; + const botlist = document.getElementById('botmon__botslist'); /* Known bots */ + botlist.innerHTML = "
Known bots (top 5)
"; let bots = BotMon.live.data.analytics.groups.knownBots.toSorted( (a, b) => { return b._pageViews.length - a._pageViews.length; }); - for (let i=0; i < Math.min(bots.length, 4); i++) { + for (let i=0; i < Math.min(bots.length, 5); i++) { const dd = makeElement('dd'); - dd.appendChild(makeElement('span', {'class': 'bot bot_' + bots[i]._bot.id }, bots[i]._bot.n)); - dd.appendChild(makeElement('strong', undefined, bots[i]._pageViews.length)); + dd.appendChild(makeElement('span', {'class': 'has_icon bot bot_' + bots[i]._bot.id }, bots[i]._bot.n)); + dd.appendChild(makeElement('span', undefined, bots[i]._pageViews.length)); botlist.appendChild(dd); } // update the suspected bot IP ranges list: const botIps = document.getElementById('botmon__today__botips'); if (botIps) { - botIps.appendChild(makeElement('dt', {}, "Bot IP ranges (top 4)")); + botIps.appendChild(makeElement('dt', {}, "Bot IP ranges (top 5)")); - const ipList = BotMon.live.data.analytics.getTopBotIPRanges(4); + const ipList = BotMon.live.data.analytics.getTopBotIPRanges(5); ipList.forEach( (ipInfo) => { const li = makeElement('dd'); - li.appendChild(makeElement('span', {'class': 'ip ip' + ipInfo.typ }, ipInfo.ip)); + li.appendChild(makeElement('span', {'class': 'has_icon ipaddr ip' + ipInfo.typ }, ipInfo.ip)); li.appendChild(makeElement('span', {'class': 'count' }, ipInfo.num)); botIps.append(li) }); @@ -1517,11 +1573,11 @@ BotMon.live = { // update the top bot countries list: const botCountries = document.getElementById('botmon__today__countries'); if (botCountries) { - botCountries.appendChild(makeElement('dt', {}, "Bot Countries (top 4)")); - const countryList = BotMon.live.data.analytics.getCountryList('likely_bot', 4); + botCountries.appendChild(makeElement('dt', {}, "Bot Countries (top 5)")); + const countryList = BotMon.live.data.analytics.getCountryList('likely_bot', 5); countryList.forEach( (cInfo) => { const cLi = makeElement('dd'); - cLi.appendChild(makeElement('span', {'class': 'country ctry_' + cInfo.iso }, cInfo.name)); + cLi.appendChild(makeElement('span', {'class': 'has_icon country ctry_' + cInfo.iso.toLowerCase() }, cInfo.name)); cLi.appendChild(makeElement('span', {'class': 'count' }, cInfo.count)); botCountries.appendChild(cLi); }); @@ -1569,7 +1625,7 @@ BotMon.live = { if (clientList) { clientList.forEach( (cInfo) => { const cDd = makeElement('dd'); - cDd.appendChild(makeElement('span', {'class': 'has_icon client_' + cInfo.id }, ( cInfo.name ? cInfo.name : cInfo.id))); + cDd.appendChild(makeElement('span', {'class': 'has_icon client cl_' + cInfo.id }, ( cInfo.name ? cInfo.name : cInfo.id))); cDd.appendChild(makeElement('span', { 'class': 'count', 'title': cInfo.count + " page views" @@ -1589,7 +1645,7 @@ BotMon.live = { if (pfList) { pfList.forEach( (pInfo) => { const pDd = makeElement('dd'); - pDd.appendChild(makeElement('span', {'class': 'has_icon client_' + pInfo.id }, ( pInfo.name ? pInfo.name : pInfo.id))); + pDd.appendChild(makeElement('span', {'class': 'has_icon platform pf_' + pInfo.id }, ( pInfo.name ? pInfo.name : pInfo.id))); pDd.appendChild(makeElement('span', { 'class': 'count', 'title': pInfo.count + " page views" @@ -1622,7 +1678,7 @@ BotMon.live = { BotMon.live.gui.status._errorCount += 1; const el = document.getElementById('botmon__today__status'); if (el) { - el.innerText = "An error occured. See the browser log for details!"; + el.innerText = "An error occurred. Data may be incomplete! See browser console for details"; el.classList.add('error'); } }, @@ -1688,8 +1744,8 @@ BotMon.live = { 'data-loaded': false }); const title = details.appendChild(makeElement('summary')); - title.appendChild(makeElement('span', {'class':'title'}, listTitle)); - title.appendChild(makeElement('span', {'class':'counter'}, '–')); + title.appendChild(makeElement('span', {'class': 'title'}, listTitle)); + title.appendChild(makeElement('span', {'class': 'counter'})); details.addEventListener("toggle", this._onDetailsToggle); parent.appendChild(details); @@ -1731,6 +1787,8 @@ BotMon.live = { const make = BotMon.t._makeElement; let ipType = ( data.ip.indexOf(':') >= 0 ? '6' : '4' ); + if (data.ip == '127.0.0.1' || data.ip == '::1' ) ipType = '0'; + const platformName = (data._platform ? data._platform.n : 'Unknown'); const clientName = (data._client ? data._client.n: 'Unknown'); @@ -1742,12 +1800,22 @@ BotMon.live = { const span1 = make('span'); /* left-hand group */ // country flag: - if (data.geo && data.geo !=='') { - span1.appendChild(make('span', { - 'class': 'icon country ctry_' + data.geo.toLowerCase(), - 'data-ctry': data.geo, - 'title': "Country: " + data._country - }, data._country)); + span1.appendChild(make('span', { + 'class': 'icon_only country ctry_' + data.geo.toLowerCase(), + 'data-ctry': (data.geo | 'ZZ'), + 'title': "Country: " + ( data._country || "Unknown") + }, ( data._country || "Unknown") )); + + if (data._type !== BM_USERTYPE.KNOWN_BOT) { /* No platform/client for bots */ + span1.appendChild(make('span', { /* Platform */ + 'class': 'icon_only platform pf_' + (data._platform ? data._platform.id : 'unknown'), + 'title': "Platform: " + platformName + }, platformName)); + + span1.appendChild(make('span', { /* Client */ + 'class': 'icon_only client client cl_' + (data._client ? data._client.id : 'unknown'), + 'title': "Client: " + clientName + }, clientName)); } // identifier: @@ -1755,36 +1823,29 @@ BotMon.live = { const botName = ( data._bot && data._bot.n ? data._bot.n : "Unknown"); span1.appendChild(make('span', { /* Bot */ - 'class': 'bot bot_' + (data._bot ? data._bot.id : 'unknown'), + 'class': 'has_icon bot bot_' + (data._bot ? data._bot.id : 'unknown'), 'title': "Bot: " + botName }, botName)); } else if (data._type == BM_USERTYPE.KNOWN_USER) { /* User only */ span1.appendChild(make('span', { /* User */ - 'class': 'user_known', + 'class': 'has_icon user_known', 'title': "User: " + data.usr }, data.usr)); } else { /* others */ - if (data.ip == '127.0.0.1' || data.ip == '::1' ) ipType = '0'; - span1.appendChild(make('span', { /* IP-Address */ - 'class': 'ipaddr ip' + ipType, + + /*span1.appendChild(make('span', { // IP-Address + 'class': 'has_icon ipaddr ip' + ipType, 'title': "IP-Address: " + data.ip - }, data.ip)); - } + }, data.ip));*/ - if (data._type !== BM_USERTYPE.KNOWN_BOT) { /* Not for bots */ - span1.appendChild(make('span', { /* Platform */ - 'class': 'icon platform platform_' + (data._platform ? data._platform.id : 'unknown'), - 'title': "Platform: " + platformName - }, platformName)); - - span1.appendChild(make('span', { /* Client */ - 'class': 'icon client client_' + (data._client ? data._client.id : 'unknown'), - 'title': "Client: " + clientName - }, clientName)); + span1.appendChild(make('span', { /* Internal ID */ + 'class': 'has_icon session typ_' + data.typ, + 'title': "ID: " + data.id + }, data.id)); } summary.appendChild(span1); @@ -1818,7 +1879,7 @@ BotMon.live = { if (data._type == BM_USERTYPE.KNOWN_BOT) { dl.appendChild(make('dt', {}, "Bot name:")); /* bot info */ - dl.appendChild(make('dd', {'class': 'has_icon bot bot_' + (data._bot ? data._bot.id : 'unknown')}, + dl.appendChild(make('dd', {'class': 'icon_only bot bot_' + (data._bot ? data._bot.id : 'unknown')}, (data._bot ? data._bot.n : 'Unknown'))); if (data._bot && data._bot.url) { @@ -1834,15 +1895,15 @@ BotMon.live = { } else { /* not for bots */ dl.appendChild(make('dt', {}, "Client:")); /* client */ - dl.appendChild(make('dd', {'class': 'has_icon client_' + (data._client ? data._client.id : 'unknown')}, + dl.appendChild(make('dd', {'class': 'has_icon client cl_' + (data._client ? data._client.id : 'unknown')}, clientName + ( data._client.v > 0 ? ' (' + data._client.v + ')' : '' ) )); dl.appendChild(make('dt', {}, "Platform:")); /* platform */ - dl.appendChild(make('dd', {'class': 'has_icon platform_' + (data._platform ? data._platform.id : 'unknown')}, + dl.appendChild(make('dd', {'class': 'has_icon platform pf_' + (data._platform ? data._platform.id : 'unknown')}, platformName + ( data._platform.v > 0 ? ' (' + data._platform.v + ')' : '' ) )); dl.appendChild(make('dt', {}, "IP-Address:")); - dl.appendChild(make('dd', {'class': 'has_icon ip' + ipType}, data.ip)); + dl.appendChild(make('dd', {'class': 'has_icon ipaddr ip' + ipType}, data.ip)); /*dl.appendChild(make('dt', {}, "ID:")); dl.appendChild(make('dd', {'class': 'has_icon ip' + data.typ}, data.id));*/ @@ -1867,7 +1928,7 @@ BotMon.live = { if (data.geo && data.geo !=='') { dl.appendChild(make('dt', {}, "Location:")); dl.appendChild(make('dd', { - 'class': 'country ctry_' + data.geo.toLowerCase(), + 'class': 'has_icon country ctry_' + data.geo.toLowerCase(), 'data-ctry': data.geo, 'title': "Country: " + data._country }, data._country + ' (' + data.geo + ')')); @@ -1876,6 +1937,9 @@ BotMon.live = { /*dl.appendChild(make('dt', {}, "Visitor Type:")); dl.appendChild(make('dd', undefined, data._type ));*/ + dl.appendChild(make('dt', {}, "Session ID:")); + dl.appendChild(make('dd', {'class': 'has_icon session typ_' + data.typ}, data.id)); + dl.appendChild(make('dt', {}, "Seen by:")); dl.appendChild(make('dd', undefined, data._seenBy.join(', ') )); diff --git a/style.less b/style.less index 89dd7cd..8090bb7 100644 --- a/style.less +++ b/style.less @@ -4,11 +4,346 @@ margin: .25rem 0; } + /* icon items */ + .has_icon { + display: inline-flex; + } + .icon_only { + display: inline-grid; + grid-template-columns: 20px max-content; + overflow: hidden; + width: 20px; + } + + .has_icon, .icon_only { + & { + align-items: center; + column-gap: .25em; + } + + &::before { + content: ''; + display: inline-block; + width: 20px; height: 20px; + background: transparent none center no-repeat; + background-position: 0 0; + background-size: 20px; + } + + /* user info Icon */ + &.user_known::before { background-image: url('img/user.svg') } + + /* IP Address types */ + &.ipaddr::before { background-image: url('img/addr.png') } + &.ip4::before { background-position-y: -20px } + &.ip6::before { background-position-y: -40px } + + /* Bot icons */ + &.bot::before { background-image: url('img/bots.png') } + &.bot_googlebot::before, &.bot_googleads::before, &.bot_googleapi::before { background-position-y: -20px } + &.bot_bingbot::before { background-position-y: -40px } + &.bot_applebot::before { background-position-y: -60px } + &.bot_openai::before { background-position-y: -80px } + &.bot_metabots::before { background-position-y: -100px } + &.bot_ahrefs::before { background-position-y: -120px } + &.bot_seznambot::before { background-position-y: -140px } + + /* platform icons */ + + &.platform::before { background-image: url('img/platforms.png') } + &.pf_win10::before { background-position-y: -20px } + &.pf_winold::before, dd.platform_winold::before, + &.pf_winsrvr:before { background-position-y: -40px } + &.pf_macos::before { background-position-y: -60px } + &.pf_macosold::before { background-position-y: -80px } + &.pf_ios::before { background-position-y: -100px } + &.pf_android::before { background-position-y: -120px } + &.pf_linux::before { background-position-y: -160px } + &.pf_bsd::before { background-position-y: -180px } + &.pf_chromium::before { background-position-y: -200px } + &.pf_hmos::before { background-position-y: -220px } + &.pf_tizen::before { background-position-y: -240px } + + /* browser icons */ + &.client::before { background-image: url('img/clients.png') } + &.cl_firefox::before { background-position-y: -20px } + &.cl_safari::before { background-position-y: -40px } + &.cl_chrome::before { background-position-y: -60px } + &.cl_chromeold::before { background-position-y: -60px; opacity: 75%; filter: ~"saturate(25%)"; } + &.cl_msedge::before { background-position-y: -80px } + &.cl_msie::before { background-position-y: -100px } + &.cl_opera::before { background-position-y: -120px } + &.cl_brave::before { background-position-y: -140px } + &.cl_ddg::before { background-position-y: -160px } + &.cl_samsung::before { background-position-y: -180px } + &.cl_huawei::before { background-position-y: -200px } + &.cl_vivaldi::before { background-position-y: -220px } + &.cl_aol::before { background-position-y: -240px } + &.cl_ya::before { background-position-y: -260px } + + /* Country flags */ + /* Note: flag images and CSS adapted from: https://github.com/lafeber/world-flags-sprite/ */ + &.country::before { + content: ''; + height: 20px; width: 20px; + background:url(img/flags.png) no-repeat 0 0; + background-size: 20px auto; + } + &.ctry_ad::before { background-position-y: -441px } + &.ctry_ae::before { background-position-y: -461px } + &.ctry_af::before { background-position-y: -481px } + &.ctry_ag::before { background-position-y: -501px } + &.ctry_ai::before { background-position-y: -521px } + &.ctry_al::before { background-position-y: -541px } + &.ctry_am::before { background-position-y: -561px } + &.ctry_ao::before { background-position-y: -581px } + &.ctry_aq::before { background-position-y: -601px } + &.ctry_ar::before { background-position-y: -621px } + &.ctry_as::before { background-position-y: -641px } + &.ctry_at::before { background-position-y: -661px } + &.ctry_au::before { background-position-y: -681px } + &.ctry_aw::before { background-position-y: -701px } + &.ctry_ax::before { background-position-y: -721px } + &.ctry_az::before { background-position-y: -741px } + &.ctry_ba::before { background-position-y: -761px } + &.ctry_bb::before { background-position-y: -781px } + &.ctry_bd::before { background-position-y: -801px } + &.ctry_be::before { background-position-y: -821px } + &.ctry_bf::before { background-position-y: -841px } + &.ctry_bg::before { background-position-y: -861px } + &.ctry_bh::before { background-position-y: -881px } + &.ctry_bi::before { background-position-y: -901px } + &.ctry_bj::before { background-position-y: -921px } + &.ctry_bm::before { background-position-y: -941px } + &.ctry_bn::before { background-position-y: -961px } + &.ctry_bo::before { background-position-y: -981px } + &.ctry_br::before { background-position-y: -1001px } + &.ctry_bs::before { background-position-y: -1021px } + &.ctry_bt::before { background-position-y: -1041px } + &.ctry_bw::before { background-position-y: -1061px } + &.ctry_by::before { background-position-y: -1081px } + &.ctry_bz::before { background-position-y: -1101px } + &.ctry_ca::before { background-position-y: -1121px } + &.ctry_cd::before { background-position-y: -1141px } + &.ctry_cf::before { background-position-y: -1161px } + &.ctry_cg::before { background-position-y: -1181px } + &.ctry_ch::before { background-position-y: -1201px } + &.ctry_ci::before { background-position-y: -1221px } + &.ctry_ck::before { background-position-y: -1241px } + &.ctry_cl::before { background-position-y: -1261px } + &.ctry_cm::before { background-position-y: -1281px } + &.ctry_cn::before { background-position-y: -1301px } + &.ctry_co::before { background-position-y: -1321px } + &.ctry_cr::before { background-position-y: -1341px } + &.ctry_cu::before { background-position-y: -1361px } + &.ctry_cv::before { background-position-y: -1381px } + &.ctry_cy::before { background-position-y: -1401px } + &.ctry_cz::before { background-position-y: -1421px } + &.ctry_de::before { background-position-y: -1441px } + &.ctry_dj::before { background-position-y: -1461px } + &.ctry_dk::before { background-position-y: -1481px } + &.ctry_dm::before { background-position-y: -1501px } + &.ctry_do::before { background-position-y: -1521px } + &.ctry_dz::before { background-position-y: -1541px } + &.ctry_ec::before { background-position-y: -1561px } + &.ctry_ee::before { background-position-y: -1581px } + &.ctry_eg::before { background-position-y: -1601px } + &.ctry_eh::before { background-position-y: -1621px } + &.ctry_er::before { background-position-y: -1641px } + &.ctry_es::before { background-position-y: -1661px } + &.ctry_et::before { background-position-y: -1681px } + &.ctry_fi::before { background-position-y: -1701px } + &.ctry_fj::before { background-position-y: -1721px } + &.ctry_fm::before { background-position-y: -1741px } + &.ctry_fo::before { background-position-y: -1761px } + &.ctry_fr::before, &.ctry_bl::before, &.ctry_cp::before, &.ctry_mf::before, + &.ctry_yt::before { background-position-y: -1781px } + &.ctry_ga::before { background-position-y: -1801px } + &.ctry_bg::before, &.ctry_uk::before, + &.ctry_sh::before { background-position-y: -1821px } + &.ctry_gd::before { background-position-y: -1841px } + &.ctry_ge::before { background-position-y: -1861px } + &.ctry_gg::before { background-position-y: -1881px } + &.ctry_gh::before { background-position-y: -1901px } + &.ctry_gi::before { background-position-y: -1921px } + &.ctry_gl::before { background-position-y: -1941px } + &.ctry_gm::before { background-position-y: -1961px } + &.ctry_gn::before { background-position-y: -1981px } + &.ctry_gp::before { background-position-y: -2001px } + &.ctry_gq::before { background-position-y: -2021px } + &.ctry_gr::before { background-position-y: -2041px } + &.ctry_gt::before { background-position-y: -2061px } + &.ctry_gu::before { background-position-y: -2081px } + &.ctry_gw::before { background-position-y: -2101px } + &.ctry_gy::before { background-position-y: -2121px } + &.ctry_hk::before { background-position-y: -2141px } + &.ctry_hn::before { background-position-y: -2161px } + &.ctry_hr::before { background-position-y: -2181px } + &.ctry_ht::before { background-position-y: -2201px } + &.ctry_hu::before { background-position-y: -2221px } + &.ctry_mc::before { background-position-y: -2241px } + &.ctry_ie::before { background-position-y: -2261px } + &.ctry_il::before { background-position-y: -2281px } + &.ctry_im::before { background-position-y: -2301px } + &.ctry_in::before { background-position-y: -2321px } + &.ctry_iq::before { background-position-y: -2341px } + &.ctry_ir::before { background-position-y: -2361px } + &.ctry_is::before { background-position-y: -2381px } + &.ctry_it::before { background-position-y: -2401px } + &.ctry_je::before { background-position-y: -2421px } + &.ctry_jm::before { background-position-y: -2441px } + &.ctry_jo::before { background-position-y: -2461px } + &.ctry_jp::before { background-position-y: -2481px } + &.ctry_ke::before { background-position-y: -2501px } + &.ctry_kg::before { background-position-y: -2521px } + &.ctry_kh::before { background-position-y: -2541px } + &.ctry_ki::before { background-position-y: -2561px } + &.ctry_km::before { background-position-y: -2581px } + &.ctry_kn::before { background-position-y: -2601px } + &.ctry_kp::before { background-position-y: -2621px } + &.ctry_kr::before { background-position-y: -2641px } + &.ctry_kw::before { background-position-y: -2661px } + &.ctry_ky::before { background-position-y: -2681px } + &.ctry_kz::before { background-position-y: -2701px } + &.ctry_la::before { background-position-y: -2721px } + &.ctry_lb::before { background-position-y: -2741px } + &.ctry_lc::before { background-position-y: -2761px } + &.ctry_li::before { background-position-y: -2781px } + &.ctry_lk::before { background-position-y: -2801px } + &.ctry_lr::before { background-position-y: -2821px } + &.ctry_ls::before { background-position-y: -2841px } + &.ctry_lt::before { background-position-y: -2861px } + &.ctry_lu::before { background-position-y: -2881px } + &.ctry_lv::before { background-position-y: -2901px } + &.ctry_ly::before { background-position-y: -2921px } + &.ctry_ma::before { background-position-y: -2941px } + &.ctry_md::before { background-position-y: -2961px } + &.ctry_me::before { background-position-y: -2981px } + &.ctry_mg::before { background-position-y: -3001px } + &.ctry_mh::before { background-position-y: -3021px } + &.ctry_mk::before { background-position-y: -3041px } + &.ctry_ml::before { background-position-y: -3061px } + &.ctry_mm::before { background-position-y: -3081px } + &.ctry_mn::before { background-position-y: -3101px } + &.ctry_mo::before { background-position-y: -3121px } + &.ctry_mq::before { background-position-y: -3141px } + &.ctry_mr::before { background-position-y: -3161px } + &.ctry_ms::before { background-position-y: -3181px } + &.ctry_mt::before { background-position-y: -3201px } + &.ctry_mu::before { background-position-y: -3221px } + &.ctry_mv::before { background-position-y: -3241px } + &.ctry_mw::before { background-position-y: -3261px } + &.ctry_mx::before { background-position-y: -3281px } + &.ctry_my::before { background-position-y: -3301px } + &.ctry_mz::before { background-position-y: -3321px } + &.ctry_na::before { background-position-y: -3341px } + &.ctry_nc::before { background-position-y: -3361px } + &.ctry_ne::before { background-position-y: -3381px } + &.ctry_ng::before { background-position-y: -3401px } + &.ctry_ni::before { background-position-y: -3421px } + &.ctry_nl::before, + &.ctry_bq::before { background-position-y: -3441px } + &.ctry_no::before, &.ctry_bv::before , &.ctry_nq::before, + &.ctry_sj::before { background-position-y: -3461px } + &.ctry_np::before { background-position-y: -3481px } + &.ctry_nr::before { background-position-y: -3501px } + &.ctry_nz::before { background-position-y: -3521px } + &.ctry_om::before { background-position-y: -3541px } + &.ctry_pa::before { background-position-y: -3561px } + &.ctry_pe::before { background-position-y: -3581px } + &.ctry_pf::before { background-position-y: -3601px } + &.ctry_pg::before { background-position-y: -3621px } + &.ctry_ph::before { background-position-y: -3641px } + &.ctry_pk::before { background-position-y: -3661px } + &.ctry_pl::before { background-position-y: -3681px } + &.ctry_pr::before { background-position-y: -3701px } + &.ctry_ps::before { background-position-y: -3721px } + &.ctry_pt::before { background-position-y: -3741px } + &.ctry_pw::before { background-position-y: -3761px } + &.ctry_py::before { background-position-y: -3781px } + &.ctry_qa::before { background-position-y: -3801px } + &.ctry_re::before { background-position-y: -3821px } + &.ctry_ro::before { background-position-y: -3841px } + &.ctry_rs::before { background-position-y: -3861px } + &.ctry_ru::before { background-position-y: -3881px } + &.ctry_rw::before { background-position-y: -3901px } + &.ctry_sa::before { background-position-y: -3921px } + &.ctry_sb::before { background-position-y: -3941px } + &.ctry_sc::before { background-position-y: -3961px } + &.ctry_sd::before { background-position-y: -3981px } + &.ctry_se::before { background-position-y: -4001px } + &.ctry_sg::before { background-position-y: -4021px } + &.ctry_si::before { background-position-y: -4041px } + &.ctry_sk::before { background-position-y: -4061px } + &.ctry_sl::before { background-position-y: -4081px } + &.ctry_sm::before { background-position-y: -4101px } + &.ctry_sn::before { background-position-y: -4121px } + &.ctry_so::before { background-position-y: -4141px } + &.ctry_sr::before { background-position-y: -4161px } + &.ctry_st::before { background-position-y: -4181px } + &.ctry_sv::before { background-position-y: -4201px } + &.ctry_sy::before { background-position-y: -4221px } + &.ctry_sz::before { background-position-y: -4241px } + &.ctry_tc::before { background-position-y: -4261px } + &.ctry_td::before { background-position-y: -4281px } + &.ctry_tg::before { background-position-y: -4301px } + &.ctry_th::before { background-position-y: -4321px } + &.ctry_tj::before { background-position-y: -4341px } + &.ctry_tl::before { background-position-y: -4361px } + &.ctry_tm::before { background-position-y: -4381px } + &.ctry_tn::before { background-position-y: -4401px } + &.ctry_to::before { background-position-y: -4421px } + &.ctry_tr::before { background-position-y: -4441px } + &.ctry_tt::before { background-position-y: -4461px } + &.ctry_tv::before { background-position-y: -4481px } + &.ctry_tw::before { background-position-y: -4501px } + &.ctry_tz::before { background-position-y: -4521px } + &.ctry_ua::before { background-position-y: -4541px } + &.ctry_ug::before { background-position-y: -4561px } + &.ctry_us::before { background-position-y: -4581px } + &.ctry_uy::before { background-position-y: -4601px } + &.ctry_uz::before { background-position-y: -4621px } + &.ctry_va::before { background-position-y: -4641px } + &.ctry_vc::before { background-position-y: -4661px } + &.ctry_ve::before { background-position-y: -4681px } + &.ctry_vg::before { background-position-y: -4701px } + &.ctry_vi::before { background-position-y: -4721px } + &.ctry_vn::before { background-position-y: -4741px } + &.ctry_vu::before { background-position-y: -4761px } + &.ctry_ws::before { background-position-y: -4781px } + &.ctry_ye::before { background-position-y: -4801px } + &.ctry_za::before { background-position-y: -4821px } + &.ctry_zm::before { background-position-y: -4841px } + &.ctry_zw::before { background-position-y: -4861px } + &.ctry_sx::before { background-position-y: -4881px } + &.ctry_cw::before { background-position-y: -4901px } + &.ctry_ss::before { background-position-y: -4921px } + &.ctry_nu::before { background-position-y: -4941px } + + &.ctry_local::before { background-image: url('img/addr.png') } /* localhost */ + + /* Session icons */ + &.session::before { background-image: url('img/idtyp.png') } + &.typ_dw::before { background-position-y: -20px } + &.typ_php::before { background-position-y: -40px } + &.typ_ip::before { background-position-y: -60px } + &.typ_usr::before { background-position-y: -80px } + } + /* grid layout for the overview: */ .botmon_overview_grid { - display: grid; - grid-template-columns: 1fr 1fr 1fr 1fr; - grid-gap: 0 .33em; + & { + display: grid; + grid-template-columns: 1fr 1fr 1fr 1fr; + grid-gap: 0 .33em; + } + dl { + dd { + display: flex; + justify-content: space-between; + align-items: baseline; + } + } } /* the "today" tab: */ @@ -43,9 +378,11 @@ margin-bottom: .2em; } dd { + padding: 0; margin: 0; + } + dd.spaced { display: flex; justify-content: space-between; - padding: 0; margin: 0; } dd:nth-child(even) { background-color: #EEE; @@ -151,26 +488,6 @@ details ul > li > details > summary > span:first-child { flex-grow: 1; } - details ul > li > details > summary > span > span { - display: flex; - align-items: center; - column-gap: .25em; - height: 1.5em; - overflow: hidden; - margin-right: .2rem; - } - details ul > li > details > summary > span > span::before { - content: ''; - display: inline-block; - min-width: 1.25em; height: 1em; - text-align: center; - background: transparent url('img/placeholder.svg') center no-repeat; - background-size: 1em; - } - details ul > li > details > summary > span > span.icon { - width: 1.25em; - overflow: hidden; - } details ul > li > details > summary > span > span[title] { cursor: help; } @@ -186,14 +503,8 @@ white-space: nowrap; } dd { - & { - grid-column: 2; - display: inline-block; - background-color: transparent; - } - /*&.bot-rating { - text-align: right; - }*/ + grid-column: 2; + background-color: transparent; } dd.pages { & { @@ -225,13 +536,6 @@ } } } - dd.has_icon::before { - content: ''; - display: inline-block; - width: 1.25em; height: 1.25em; - background: transparent url('img/placeholder.svg') center no-repeat; - background-size: 1em; - } ul.eval { li { @@ -248,316 +552,10 @@ } } - /* bot icons */ - span.bot::before, dd.bot::before { background-image: url('img/robot.svg') } - span.bot_bingbot::before, dd.bot_bingbot::before { background-image: url('img/bing.svg') } - span.bot_googlebot::before, dd.bot_googlebot::before, - span.bot_googleads::before, dd.bot_googleads::before, - span.bot_googleapi::before, dd.bot_googleapi::before { background-image: url('img/google.svg') } - span.bot_applebot::before, dd.bot_applebot::before { background-image: url('img/apple.svg') } - span.bot_slurp::before, dd.bot_slurp::before { background-image: url('img/yahoo.svg') } - span.bot_ddg::before, dd.bot_ddg::before { background-image: url('img/ddg.svg') } - span.bot_openai::before, dd.bot_openai::before { background-image: url('img/openai.svg') } - span.bot_claude::before, dd.bot_claude::before { background-image: url('img/anthropic.png') } - span.bot_perplexity::before, dd.bot_perplexity::before { background-image: url('img/perplexity.svg') } - span.bot_metabots::before, dd.bot_metabots::before { background-image: url('img/meta.svg') } - span.bot_qwant::before, dd.bot_qwant::before { background-image: url('img/qwant.svg') } - span.bot_yandex::before, dd.bot_yandex::before { background-image: url('img/yandex.svg') } - span.bot_seznambot::before, dd.bot_seznambot::before { background-image: url('img/seznam.svg') } - span.bot_ahrefs::before, dd.bot_ahrefs::before { background-image: url('img/ahrefs.png') } - span.bot_ccbot::before, dd.bot_ccbot::before { background-image: url('img/ccbot.png') } - span.bot_mjbot::before, dd.bot_mjbot::before { background-image: url('img/majestic.png') } - span.bot_petal::before, dd.bot_petal::before { background-image: url('img/petal.svg') } - span.bot_barkrowler::before, dd.bot_barkrowler::before { background-image: url('img/babbar.png') } - span.bot_semrush::before, dd.bot_semrush::before { background-image: url('img/semrush.png') } - span.bot_bytespider::before, dd.bot_bytespider::before { background-image: url('img/bytedance.svg') } - span.bot_dfseo::before, dd.bot_dfseo::before { background-image: url('img/dataforseo.png') } - span.bot_hunter::before, dd.bot_hunter::before { background-image: url('img/hunter.png') } - span.bot_serpstat::before, dd.bot_serpstat::before { background-image: url('img/serpstat.svg') } - span.bot_netestate::before, dd.bot_netestate::before { background-image: url('img/netestate.png') } - span.bot_imagesift::before, dd.bot_imagesift::before { background-image: url('img/hive.svg') } - /*span.bot_mozcom::before, dd.bot_mozcom::before { background-image: url('img/moz.svg') }*/ - /*span.bot_maui::before, dd.bot_maui::before { background-image: url('img/maui.svg') }*/ - span.bot_plagaware::before, dd.bot_plagaware::before { background-image: url('img/plagaware.png') } - - /* user info */ - span.user_known::before { background-image: url('img/user.svg') } - - /* platform icons */ - span.platform_win10::before, dd.platform_win10::before { background-image: url('img/win11.svg') } - span.platform_macos::before, dd.platform_macos::before { background-image: url('img/apple.svg') } - span.platform_linux::before, dd.platform_linux::before { background-image: url('img/linux.svg') } - span.platform_ios::before, dd.platform_ios::before { background-image: url('img/ios.svg') } - span.platform_android::before, dd.platform_android::before { background-image: url('img/android.svg') } - span.platform_winold::before, dd.platform_winold::before, - span.platform_winsrvr:before, dd.platform_winsrvr::before { background-image: url('img/winold.png') } - span.platform_macosold::before, dd.platform_macosold::before { background-image: url('img/macos.svg') } - span.platform_tizen::before, dd.platform_tizen::before { background-image: url('img/tizen.png') } - span.platform_hmos::before, dd.platform_hmos::before { background-image: url('img/hmos.svg') } - span.platform_chromium::before, dd.platform_chromium::before { background-image: url('img/chromium.svg') } - span.platform_bsd::before, dd.platform_bsd::before { background-image: url('img/freebsd.png') } - - /* browser icons */ - span.client_opera::before, dd.client_opera::before { background-image: url('img/opera.svg') } - span.client_msie::before, dd.client_msie::before { background-image: url('img/msie.svg') } - span.client_brave::before, dd.client_brave::before { background-image: url('img/brave.svg') } - span.client_msedge::before, dd.client_msedge::before { background-image: url('img/msedge.svg') } - span.client_chrome::before, dd.client_chrome::before { background-image: url('img/chrome.svg') } - span.client_chromeold::before, dd.client_chromeold::before { background-image: url('img/chromeold.svg') } - span.client_safari::before, dd.client_safari::before { background-image: url('img/safari.png') } - span.client_ddg::before, dd.client_ddg::before { background-image: url('img/ddg.svg') } - span.client_firefox::before, dd.client_firefox::before { background-image: url('img/firefox.png') } - span.client_samsung::before, dd.client_samsung::before { background-image: url('img/samsung.svg') } - span.client_uc::before, dd.client_uc::before { background-image: url('img/uc.svg') } - span.client_huawei::before, dd.client_huawei::before { background-image: url('img/huawei.png') } - span.client_vivaldi::before, dd.client_vivaldi::before { background-image: url('img/vivaldi.svg') } - span.client_aol::before, dd.client_aol::before { background-image: url('img/aol.png') } - span.client_ya::before, dd.client_ya::before { background-image: url('img/yandex.svg') } - - /* ip address type */ - span.ip6::before, dd.ip6::before { background-image: url('img/ip6.svg') } - span.ip4::before, dd.ip4::before { background-image: url('img/ip4.svg') } - span.ip0::before, dd.ip0::before { background-image: url('img/localhost.svg') } - - /* Country flags */ - /* Note: flag images and CSS adapted from: https://github.com/lafeber/world-flags-sprite/ */ - span.country::before, dd.country::before { - content: ''; - display: inline-block; - height: 16px; width: 16px; - background:url(img/flags.png) no-repeat center; - background-position: 0 0; - } - span.ctry_ad::before, dd.ctry_ad::before { background-position-y: -353px } - span.ctry_ae::before, dd.ctry_ae::before { background-position-y: -369px } - span.ctry_af::before, dd.ctry_af::before { background-position-y: -385px } - span.ctry_ag::before, dd.ctry_ag::before { background-position-y: -401px } - span.ctry_ai::before, dd.ctry_ai::before { background-position-y: -417px } - span.ctry_al::before, dd.ctry_al::before { background-position-y: -433px } - span.ctry_am::before, dd.ctry_am::before { background-position-y: -449px } - span.ctry_ao::before, dd.ctry_ao::before { background-position-y: -465px } - span.ctry_aq::before, dd.ctry_aq::before { background-position-y: -481px } - span.ctry_ar::before, dd.ctry_ar::before { background-position-y: -497px } - span.ctry_as::before, dd.ctry_as::before { background-position-y: -513px } - span.ctry_at::before, dd.ctry_at::before { background-position-y: -529px } - span.ctry_au::before, dd.ctry_au::before { background-position-y: -545px } - span.ctry_aw::before, dd.ctry_aw::before { background-position-y: -561px } - span.ctry_ax::before, dd.ctry_ax::before { background-position-y: -577px } - span.ctry_az::before, dd.ctry_az::before { background-position-y: -593px } - span.ctry_ba::before, dd.ctry_ba::before { background-position-y: -609px } - span.ctry_bb::before, dd.ctry_bb::before { background-position-y: -625px } - span.ctry_bd::before, dd.ctry_bd::before { background-position-y: -641px } - span.ctry_be::before, dd.ctry_be::before { background-position-y: -657px } - span.ctry_bf::before, dd.ctry_bf::before { background-position-y: -673px } - span.ctry_bg::before, dd.ctry_bg::before { background-position-y: -689px } - span.ctry_bh::before, dd.ctry_bh::before { background-position-y: -705px } - span.ctry_bi::before, dd.ctry_bi::before { background-position-y: -721px } - span.ctry_bj::before, dd.ctry_bj::before { background-position-y: -737px } - span.ctry_bm::before, dd.ctry_bm::before { background-position-y: -753px } - span.ctry_bn::before, dd.ctry_bn::before { background-position-y: -769px } - span.ctry_bo::before, dd.ctry_bo::before { background-position-y: -785px } - span.ctry_br::before, dd.ctry_br::before { background-position-y: -801px } - span.ctry_bs::before, dd.ctry_bs::before { background-position-y: -817px } - span.ctry_bt::before, dd.ctry_bt::before { background-position-y: -833px } - span.ctry_bw::before, dd.ctry_bw::before { background-position-y: -849px } - span.ctry_by::before, dd.ctry_by::before { background-position-y: -865px } - span.ctry_bz::before, dd.ctry_bz::before { background-position-y: -881px } - span.ctry_ca::before, dd.ctry_ca::before { background-position-y: -897px } - span.ctry_cd::before, dd.ctry_cd::before { background-position-y: -913px } - span.ctry_cf::before, dd.ctry_cf::before { background-position-y: -929px } - span.ctry_cg::before, dd.ctry_cg::before { background-position-y: -945px } - span.ctry_ch::before, dd.ctry_ch::before { background-position-y: -961px } - span.ctry_ci::before, dd.ctry_ci::before { background-position-y: -977px } - span.ctry_ck::before, dd.ctry_ck::before { background-position-y: -993px } - span.ctry_cl::before, dd.ctry_cl::before { background-position-y: -1009px } - span.ctry_cm::before, dd.ctry_cm::before { background-position-y: -1025px } - span.ctry_cn::before, dd.ctry_cn::before { background-position-y: -1041px } - span.ctry_co::before, dd.ctry_co::before { background-position-y: -1057px } - span.ctry_cr::before, dd.ctry_cr::before { background-position-y: -1073px } - span.ctry_cu::before, dd.ctry_cu::before { background-position-y: -1089px } - span.ctry_cv::before, dd.ctry_cv::before { background-position-y: -1105px } - span.ctry_cy::before, dd.ctry_cy::before { background-position-y: -1121px } - span.ctry_cz::before, dd.ctry_cz::before { background-position-y: -1137px } - span.ctry_de::before, dd.ctry_de::before { background-position-y: -1153px } - span.ctry_dj::before, dd.ctry_dj::before { background-position-y: -1169px } - span.ctry_dk::before, dd.ctry_dk::before { background-position-y: -1185px } - span.ctry_dm::before, dd.ctry_dm::before { background-position-y: -1201px } - span.ctry_do::before, dd.ctry_do::before { background-position-y: -1217px } - span.ctry_dz::before, dd.ctry_dz::before { background-position-y: -1233px } - span.ctry_ec::before, dd.ctry_ec::before { background-position-y: -1249px } - span.ctry_ee::before, dd.ctry_ee::before { background-position-y: -1265px } - span.ctry_eg::before, dd.ctry_eg::before { background-position-y: -1281px } - span.ctry_eh::before, dd.ctry_eh::before { background-position-y: -1297px } - span.ctry_er::before, dd.ctry_er::before { background-position-y: -1313px } - span.ctry_es::before, dd.ctry_es::before { background-position-y: -1329px } - span.ctry_et::before, dd.ctry_et::before { background-position-y: -1345px } - span.ctry_fi::before, dd.ctry_fi::before { background-position-y: -1361px } - span.ctry_fj::before, dd.ctry_fj::before { background-position-y: -1377px } - span.ctry_fm::before, dd.ctry_fm::before { background-position-y: -1393px } - span.ctry_fo::before, dd.ctry_fo::before { background-position-y: -1409px } - span.ctry_yt::before, dd.ctry_yt::before { background-position-y: -1425px } - span.ctry_ga::before, dd.ctry_ga::before { background-position-y: -1441px } - span.ctry_sh::before, dd.ctry_sh::before { background-position-y: -1457px } - span.ctry_gd::before, dd.ctry_gd::before { background-position-y: -1473px } - span.ctry_ge::before, dd.ctry_ge::before { background-position-y: -1489px } - span.ctry_gg::before, dd.ctry_gg::before { background-position-y: -1505px } - span.ctry_gh::before, dd.ctry_gh::before { background-position-y: -1521px } - span.ctry_gi::before, dd.ctry_gi::before { background-position-y: -1537px } - span.ctry_gl::before, dd.ctry_gl::before { background-position-y: -1553px } - span.ctry_gm::before, dd.ctry_gm::before { background-position-y: -1569px } - span.ctry_gn::before, dd.ctry_gn::before { background-position-y: -1585px } - span.ctry_gp::before, dd.ctry_gp::before { background-position-y: -1601px } - span.ctry_gq::before, dd.ctry_gq::before { background-position-y: -1617px } - span.ctry_gr::before, dd.ctry_gr::before { background-position-y: -1633px } - span.ctry_gt::before, dd.ctry_gt::before { background-position-y: -1649px } - span.ctry_gu::before, dd.ctry_gu::before { background-position-y: -1665px } - span.ctry_gw::before, dd.ctry_gw::before { background-position-y: -1681px } - span.ctry_gy::before, dd.ctry_gy::before { background-position-y: -1697px } - span.ctry_hk::before, dd.ctry_hk::before { background-position-y: -1713px } - span.ctry_hn::before, dd.ctry_hn::before { background-position-y: -1729px } - span.ctry_hr::before, dd.ctry_hr::before { background-position-y: -1745px } - span.ctry_ht::before, dd.ctry_ht::before { background-position-y: -1761px } - span.ctry_hu::before, dd.ctry_hu::before { background-position-y: -1777px } - span.ctry_mc::before, dd.ctry_mc::before { background-position-y: -1793px } - span.ctry_ie::before, dd.ctry_ie::before { background-position-y: -1809px } - span.ctry_il::before, dd.ctry_il::before { background-position-y: -1825px } - span.ctry_im::before, dd.ctry_im::before { background-position-y: -1841px } - span.ctry_in::before, dd.ctry_in::before { background-position-y: -1857px } - span.ctry_iq::before, dd.ctry_iq::before { background-position-y: -1873px } - span.ctry_ir::before, dd.ctry_ir::before { background-position-y: -1889px } - span.ctry_is::before, dd.ctry_is::before { background-position-y: -1905px } - span.ctry_it::before, dd.ctry_it::before { background-position-y: -1921px } - span.ctry_je::before, dd.ctry_je::before { background-position-y: -1937px } - span.ctry_jm::before, dd.ctry_jm::before { background-position-y: -1953px } - span.ctry_jo::before, dd.ctry_jo::before { background-position-y: -1969px } - span.ctry_jp::before, dd.ctry_jp::before { background-position-y: -1985px } - span.ctry_ke::before, dd.ctry_ke::before { background-position-y: -2001px } - span.ctry_kg::before, dd.ctry_kg::before { background-position-y: -2017px } - span.ctry_kh::before, dd.ctry_kh::before { background-position-y: -2033px } - span.ctry_ki::before, dd.ctry_ki::before { background-position-y: -2049px } - span.ctry_km::before, dd.ctry_km::before { background-position-y: -2065px } - span.ctry_kn::before, dd.ctry_kn::before { background-position-y: -2081px } - span.ctry_kp::before, dd.ctry_kp::before { background-position-y: -2097px } - span.ctry_kr::before, dd.ctry_kr::before { background-position-y: -2113px } - span.ctry_kw::before, dd.ctry_kw::before { background-position-y: -2129px } - span.ctry_ky::before, dd.ctry_ky::before { background-position-y: -2145px } - span.ctry_kz::before, dd.ctry_kz::before { background-position-y: -2161px } - span.ctry_la::before, dd.ctry_la::before { background-position-y: -2177px } - span.ctry_lb::before, dd.ctry_lb::before { background-position-y: -2193px } - span.ctry_lc::before, dd.ctry_lc::before { background-position-y: -2209px } - span.ctry_li::before, dd.ctry_li::before { background-position-y: -2225px } - span.ctry_lk::before, dd.ctry_lk::before { background-position-y: -2241px } - span.ctry_lr::before, dd.ctry_lr::before { background-position-y: -2257px } - span.ctry_ls::before, dd.ctry_ls::before { background-position-y: -2273px } - span.ctry_lt::before, dd.ctry_lt::before { background-position-y: -2289px } - span.ctry_lu::before, dd.ctry_lu::before { background-position-y: -2305px } - span.ctry_lv::before, dd.ctry_lv::before { background-position-y: -2321px } - span.ctry_ly::before, dd.ctry_ly::before { background-position-y: -2337px } - span.ctry_ma::before, dd.ctry_ma::before { background-position-y: -2353px } - span.ctry_md::before, dd.ctry_md::before { background-position-y: -2369px } - span.ctry_me::before, dd.ctry_me::before { background-position-y: -2385px } - span.ctry_mg::before, dd.ctry_mg::before { background-position-y: -2401px } - span.ctry_mh::before, dd.ctry_mh::before { background-position-y: -2417px } - span.ctry_mk::before, dd.ctry_mk::before { background-position-y: -2433px } - span.ctry_ml::before, dd.ctry_ml::before { background-position-y: -2449px } - span.ctry_mm::before, dd.ctry_mm::before { background-position-y: -2465px } - span.ctry_mn::before, dd.ctry_mn::before { background-position-y: -2481px } - span.ctry_mo::before, dd.ctry_mo::before { background-position-y: -2497px } - span.ctry_mq::before, dd.ctry_mq::before { background-position-y: -2513px } - span.ctry_mr::before, dd.ctry_mr::before { background-position-y: -2529px } - span.ctry_ms::before, dd.ctry_ms::before { background-position-y: -2545px } - span.ctry_mt::before, dd.ctry_mt::before { background-position-y: -2561px } - span.ctry_mu::before, dd.ctry_mu::before { background-position-y: -2577px } - span.ctry_mv::before, dd.ctry_mv::before { background-position-y: -2593px } - span.ctry_mw::before, dd.ctry_mw::before { background-position-y: -2609px } - span.ctry_mx::before, dd.ctry_mx::before { background-position-y: -2625px } - span.ctry_my::before, dd.ctry_my::before { background-position-y: -2641px } - span.ctry_mz::before, dd.ctry_mz::before { background-position-y: -2657px } - span.ctry_na::before, dd.ctry_na::before { background-position-y: -2673px } - span.ctry_nc::before, dd.ctry_nc::before { background-position-y: -2689px } - span.ctry_ne::before, dd.ctry_ne::before { background-position-y: -2705px } - span.ctry_ng::before, dd.ctry_ng::before { background-position-y: -2721px } - span.ctry_ni::before, dd.ctry_ni::before { background-position-y: -2737px } - span.ctry_bq::before, dd.ctry_bq::before { background-position-y: -2753px } - span.ctry_bv::before, dd.ctry_bv::before { background-position-y: -2769px } - span.ctry_np::before, dd.ctry_np::before { background-position-y: -2785px } - span.ctry_nr::before, dd.ctry_nr::before { background-position-y: -2801px } - span.ctry_nz::before, dd.ctry_nz::before { background-position-y: -2817px } - span.ctry_om::before, dd.ctry_om::before { background-position-y: -2833px } - span.ctry_pa::before, dd.ctry_pa::before { background-position-y: -2849px } - span.ctry_pe::before, dd.ctry_pe::before { background-position-y: -2865px } - span.ctry_pf::before, dd.ctry_pf::before { background-position-y: -2881px } - span.ctry_pg::before, dd.ctry_pg::before { background-position-y: -2897px } - span.ctry_ph::before, dd.ctry_ph::before { background-position-y: -2913px } - span.ctry_pk::before, dd.ctry_pk::before { background-position-y: -2929px } - span.ctry_pl::before, dd.ctry_pl::before { background-position-y: -2945px } - span.ctry_pr::before, dd.ctry_pr::before { background-position-y: -2961px } - span.ctry_ps::before, dd.ctry_ps::before { background-position-y: -2977px } - span.ctry_pt::before, dd.ctry_pt::before { background-position-y: -2993px } - span.ctry_pw::before, dd.ctry_pw::before { background-position-y: -3009px } - span.ctry_py::before, dd.ctry_py::before { background-position-y: -3025px } - span.ctry_qa::before, dd.ctry_qa::before { background-position-y: -3041px } - span.ctry_re::before, dd.ctry_re::before { background-position-y: -3057px } - span.ctry_ro::before, dd.ctry_ro::before { background-position-y: -3073px } - span.ctry_rs::before, dd.ctry_rs::before { background-position-y: -3089px } - span.ctry_ru::before, dd.ctry_ru::before { background-position-y: -3105px } - span.ctry_rw::before, dd.ctry_rw::before { background-position-y: -3121px } - span.ctry_sa::before, dd.ctry_sa::before { background-position-y: -3137px } - span.ctry_sb::before, dd.ctry_sb::before { background-position-y: -3153px } - span.ctry_sc::before, dd.ctry_sc::before { background-position-y: -3169px } - span.ctry_sd::before, dd.ctry_sd::before { background-position-y: -3185px } - span.ctry_se::before, dd.ctry_se::before { background-position-y: -3201px } - span.ctry_sg::before, dd.ctry_sg::before { background-position-y: -3217px } - span.ctry_si::before, dd.ctry_si::before { background-position-y: -3233px } - span.ctry_sk::before, dd.ctry_sk::before { background-position-y: -3249px } - span.ctry_sl::before, dd.ctry_sl::before { background-position-y: -3265px } - span.ctry_sm::before, dd.ctry_sm::before { background-position-y: -3281px } - span.ctry_sn::before, dd.ctry_sn::before { background-position-y: -3297px } - span.ctry_so::before, dd.ctry_so::before { background-position-y: -3313px } - span.ctry_sr::before, dd.ctry_sr::before { background-position-y: -3329px } - span.ctry_st::before, dd.ctry_st::before { background-position-y: -3345px } - span.ctry_sv::before, dd.ctry_sv::before { background-position-y: -3361px } - span.ctry_sy::before, dd.ctry_sy::before { background-position-y: -3377px } - span.ctry_sz::before, dd.ctry_sz::before { background-position-y: -3393px } - span.ctry_tc::before, dd.ctry_tc::before { background-position-y: -3409px } - span.ctry_td::before, dd.ctry_td::before { background-position-y: -3425px } - span.ctry_tg::before, dd.ctry_tg::before { background-position-y: -3441px } - span.ctry_th::before, dd.ctry_th::before { background-position-y: -3457px } - span.ctry_tj::before, dd.ctry_tj::before { background-position-y: -3473px } - span.ctry_tl::before, dd.ctry_tl::before { background-position-y: -3489px } - span.ctry_tm::before, dd.ctry_tm::before { background-position-y: -3505px } - span.ctry_tn::before, dd.ctry_tn::before { background-position-y: -3521px } - span.ctry_to::before, dd.ctry_to::before { background-position-y: -3537px } - span.ctry_tr::before, dd.ctry_tr::before { background-position-y: -3553px } - span.ctry_tt::before, dd.ctry_tt::before { background-position-y: -3569px } - span.ctry_tv::before, dd.ctry_tv::before { background-position-y: -3585px } - span.ctry_tw::before, dd.ctry_tw::before { background-position-y: -3601px } - span.ctry_tz::before, dd.ctry_tz::before { background-position-y: -3617px } - span.ctry_ua::before, dd.ctry_ua::before { background-position-y: -3633px } - span.ctry_ug::before, dd.ctry_ug::before { background-position-y: -3649px } - span.ctry_us::before, dd.ctry_us::before { background-position-y: -3665px } - span.ctry_uy::before, dd.ctry_uy::before { background-position-y: -3681px } - span.ctry_uz::before, dd.ctry_uz::before { background-position-y: -3697px } - span.ctry_va::before, dd.ctry_va::before { background-position-y: -3713px } - span.ctry_vc::before, dd.ctry_vc::before { background-position-y: -3729px } - span.ctry_ve::before, dd.ctry_ve::before { background-position-y: -3745px } - span.ctry_vg::before, dd.ctry_vg::before { background-position-y: -3761px } - span.ctry_vi::before, dd.ctry_vi::before { background-position-y: -3777px } - span.ctry_vn::before, dd.ctry_vn::before { background-position-y: -3793px } - span.ctry_vu::before, dd.ctry_vu::before { background-position-y: -3809px } - span.ctry_ws::before, dd.ctry_ws::before { background-position-y: -3825px } - span.ctry_ye::before, dd.ctry_ye::before { background-position-y: -3841px } - span.ctry_za::before, dd.ctry_za::before { background-position-y: -3857px } - span.ctry_zm::before, dd.ctry_zm::before { background-position-y: -3873px } - span.ctry_zw::before, dd.ctry_zw::before { background-position-y: -3889px } - span.ctry_sx::before, dd.ctry_sx::before { background-position-y: -3905px } - span.ctry_cw::before, dd.ctry_cw::before { background-position-y: -3921px } - span.ctry_ss::before, dd.ctry_ss::before { background-position-y: -3937px } - span.ctry_nu::before, dd.ctry_nu::before { background-position-y: -3953px } - - /* user agent */ - span.agent::before { background-image: url('img/info.svg') } + span.agent::before { + background-image: url('img/info.svg') + } /* pageviews */ span.pageviews { @@ -566,7 +564,13 @@ font-size: smaller; border-radius: .25em; } - span.pageviews::before { background-image: url('img/page.svg') } + span.pageviews::before { + content : ''; + display: inline-block; + width: 1.25em; height: 1.25em; + background: transparent url('img/page.svg') center no-repeat; + background-size: 1.25em; + } } diff --git a/tick.php b/tick.php index b5393e7..1d46b1e 100644 --- a/tick.php +++ b/tick.php @@ -1,22 +1,12 @@