diff --git a/ChangeLog b/ChangeLog index 3fb03fa..bd5fd43 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,4 @@ -v0.3 (13/07/2015) +v0.3 (12/04/2016) ** User ** Add referers_diff display plugin Add year statistics in month details @@ -15,15 +15,20 @@ v0.3 (13/07/2015) Add gz files support Add -z option (don't compress databases) Add own search enfines files + Do reverse DNS on feeds parsers + Add IPToGeo plugin ** Dev ** Add istats_diff interface Sort documentation output Add debug traces in robots plugin Update awstats data + Remove double slashes at the end of URL + Remove final slashes for referrers + Add alt attribute for all img tag ** Bugs ** Forgot tag Bad UTC time computation - Hits/pages in the same second where not analyzed + Hits/pages in the same second were not analyzed Last day of month was skipped diff --git a/awstats_data.py b/awstats_data.py index 33157e1..1c42eb9 100644 --- a/awstats_data.py +++ b/awstats_data.py @@ -4,23 +4,23 @@ robots = ['appie', 'architext', 'bingpreview', 'bjaaland', 'contentmatch', 'ferr search_engines = ['google\.[\w.]+/products', 'base\.google\.', 'froogle\.google\.', 'groups\.google\.', 'images\.google\.', 'google\.', 'googlee\.', 'googlecom\.com', 'goggle\.co\.hu', '216\.239\.(35|37|39|51)\.100', '216\.239\.(35|37|39|51)\.101', '216\.239\.5[0-9]\.104', '64\.233\.1[0-9]{2}\.104', '66\.102\.[1-9]\.104', '66\.249\.93\.104', '72\.14\.2[0-9]{2}\.104', 'msn\.', 'live\.com', 'bing\.', 'voila\.', 'mindset\.research\.yahoo', 'yahoo\.', '(66\.218\.71\.225|216\.109\.117\.135|216\.109\.125\.130|66\.218\.69\.11)', 'search\.aol\.co', 'tiscali\.', 'lycos\.', 'alexa\.com', 'alltheweb\.com', 'altavista\.', 'a9\.com', 'dmoz\.org', 'netscape\.', 'search\.terra\.', 'www\.search\.com', 'search\.sli\.sympatico\.ca', 'excite\.'] -search_engines_2 = ['4\-counter\.com', 'att\.net', 'bungeebonesdotcom', 'northernlight\.', 'hotbot\.', 'kvasir\.', 'webcrawler\.', 'metacrawler\.', 'go2net\.com', '(^|\.)go\.com', 'euroseek\.', 'looksmart\.', 'spray\.', 'nbci\.com\/search', 'de\.ask.\com', 'es\.ask.\com', 'fr\.ask.\com', 'it\.ask.\com', 'nl\.ask.\com', 'uk\.ask.\com', '(^|\.)ask\.com', 'atomz\.', 'overture\.com', 'teoma\.', 'findarticles\.com', 'infospace\.com', 'mamma\.', 'dejanews\.', 'dogpile\.com', 'wisenut\.com', 'ixquick\.com', 'search\.earthlink\.net', 'i-une\.com', 'blingo\.com', 'centraldatabase\.org', 'clusty\.com', 'mysearch\.', 'vivisimo\.com', 'kartoo\.com', 'icerocket\.com', 'sphere\.com', 'ledix\.net', 'start\.shaw\.ca', 'searchalot\.com', 'copernic\.com', 'avantfind\.com', 'steadysearch\.com', 'steady-search\.com', 'claro-search\.com', 'www1\.search-results\.com', 'www\.holasearch\.com', 'search\.conduit\.com', 'static\.flipora\.com', '(?:www[12]?|mixidj)\.delta-search\.com', 'start\.iminent\.com', 'www\.searchmobileonline\.com', 'int\.search-results\.com', 'chello\.at', 'chello\.be', 'chello\.cz', 'chello\.fr', 'chello\.hu', 'chello\.nl', 'chello\.no', 'chello\.pl', 'chello\.se', 'chello\.sk', 'chello', 'mirago\.be', 'mirago\.ch', 'mirago\.de', 'mirago\.dk', 'es\.mirago\.com', 'mirago\.fr', 'mirago\.it', 'mirago\.nl', 'no\.mirago\.com', 'mirago\.se', 'mirago\.co\.uk', 'mirago', 'answerbus\.com', 'icq\.com\/search', 'nusearch\.com', 'goodsearch\.com', 'scroogle\.org', 'questionanswering\.com', 'mywebsearch\.com', 'as\.starware\.com', 'del\.icio\.us', 'digg\.com', 'stumbleupon\.com', 'swik\.net', 'segnalo\.alice\.it', 'ineffabile\.it', 'anzwers\.com\.au', 'engine\.exe', 'miner\.bol\.com\.br', '\.baidu\.com', '\.vnet\.cn', '\.soso\.com', '\.sogou\.com', '\.3721\.com', 'iask\.com', '\.accoona\.com', '\.163\.com', '\.zhongsou\.com', 'atlas\.cz', 'seznam\.cz', 'quick\.cz', 'centrum\.cz', 'jyxo\.(cz|com)', 'najdi\.to', 'redbox\.cz', 'isearch\.avg\.com', 'opasia\.dk', 'danielsen\.com', 'sol\.dk', 'jubii\.dk', 'find\.dk', 'edderkoppen\.dk', 'netstjernen\.dk', 'orbis\.dk', 'tyfon\.dk', '1klik\.dk', 'ofir\.dk', 'ilse\.', 'vindex\.', '(^|\.)ask\.co\.uk', 'bbc\.co\.uk/cgi-bin/search', 'ifind\.freeserve', 'looksmart\.co\.uk', 'splut\.', 'spotjockey\.', 'ukdirectory\.', 'ukindex\.co\.uk', 'ukplus\.', 'searchy\.co\.uk', 'search\.fbdownloader\.com', 'search\.babylon\.com', 'haku\.www\.fi', 'recherche\.aol\.fr', 'ctrouve\.', 'francite\.', '\.lbb\.org', 'rechercher\.libertysurf\.fr', 'search[\w\-]+\.free\.fr', 'recherche\.club-internet\.fr', 'toile\.com', 'biglotron\.com', 'mozbot\.fr', 'sucheaol\.aol\.de', 'o2suche\.aol\.de', 'fireball\.de', 'infoseek\.de', 'suche\d?\.web\.de', '[a-z]serv\.rrzn\.uni-hannover\.de', 'suchen\.abacho\.de', '(brisbane|suche)\.t-online\.de', 'allesklar\.de', 'meinestadt\.de', '212\.227\.33\.241', '(161\.58\.227\.204|161\.58\.247\.101|212\.40\.165\.90|213\.133\.108\.202|217\.160\.108\.151|217\.160\.111\.99|217\.160\.131\.108|217\.160\.142\.227|217\.160\.176\.42)', 'wwweasel\.de', 'netluchs\.de', 'schoenerbrausen\.de', 'suche\.gmx\.net', 'ecosia\.org', 'de\.aolsearch\.com', 'suche\.aol\.de', 'www\.startxxl\.com', 'www\.benefind\.de', 'heureka\.hu', 'vizsla\.origo\.hu', 'lapkereso\.hu', 'goliat\.hu', 'index\.hu', 'wahoo\.hu', 'webmania\.hu', 'search\.internetto\.hu', 'tango\.hu', 'keresolap\.hu', 'polymeta\.hu', 'sify\.com', 'virgilio\.it', 'arianna\.libero\.it', 'supereva\.com', 'kataweb\.it', 'search\.alice\.it\.master', 'search\.alice\.it', 'gotuneed\.com', 'godado', 'jumpy\.it', 'shinyseek\.it', 'teecno\.it', 'search\.genieo\.com', 'ask\.jp', 'sagool\.jp', 'sok\.start\.no', 'eniro\.no', 'szukaj\.wp\.pl', 'szukaj\.onet\.pl', 'dodaj\.pl', 'gazeta\.pl', 'gery\.pl', 'hoga\.pl', 'netsprint\.pl', 'interia\.pl', 'katalog\.onet\.pl', 'o2\.pl', 'polska\.pl', 'szukacz\.pl', 'wow\.pl', 'ya(ndex)?\.ru', 'aport\.ru', 'rambler\.ru', 'turtle\.ru', 'metabot\.ru', 'evreka\.passagen\.se', 'eniro\.se', 'zoznam\.sk', 'sapo\.pt', 'search\.ch', 'search\.bluewin\.ch', 'pogodak\.', 'jwss\.cc', 'lemoteur\.orange\.fr', 'windowssearch\.com', 'qwant\.com', 'wow\.com', 'searches\.omiga-plus\.com', 'buenosearch\.com', 'searches\.vi-view\.com'] +search_engines_2 = ['4\-counter\.com', 'att\.net', 'bungeebonesdotcom', 'northernlight\.', 'hotbot\.', 'kvasir\.', 'webcrawler\.', 'metacrawler\.', 'go2net\.com', '(^|\.)go\.com', 'euroseek\.', 'looksmart\.', 'spray\.', 'nbci\.com\/search', 'de\.ask.\com', 'es\.ask.\com', 'fr\.ask.\com', 'it\.ask.\com', 'nl\.ask.\com', 'uk\.ask.\com', '(^|\.)ask\.com', 'atomz\.', 'overture\.com', 'teoma\.', 'findarticles\.com', 'infospace\.com', 'mamma\.', 'dejanews\.', 'dogpile\.com', 'wisenut\.com', 'ixquick\.com', 'search\.earthlink\.net', 'i-une\.com', 'blingo\.com', 'centraldatabase\.org', 'clusty\.com', 'mysearch\.', 'vivisimo\.com', 'kartoo\.com', 'icerocket\.com', 'sphere\.com', 'ledix\.net', 'start\.shaw\.ca', 'searchalot\.com', 'copernic\.com', 'avantfind\.com', 'steadysearch\.com', 'steady-search\.com', 'claro-search\.com', 'www1\.search-results\.com', 'www\.holasearch\.com', 'search\.conduit\.com', 'static\.flipora\.com', '(?:www[12]?|mixidj)\.delta-search\.com', 'start\.iminent\.com', 'www\.searchmobileonline\.com', 'int\.search-results\.com', 'chello\.at', 'chello\.be', 'chello\.cz', 'chello\.fr', 'chello\.hu', 'chello\.nl', 'chello\.no', 'chello\.pl', 'chello\.se', 'chello\.sk', 'chello', 'mirago\.be', 'mirago\.ch', 'mirago\.de', 'mirago\.dk', 'es\.mirago\.com', 'mirago\.fr', 'mirago\.it', 'mirago\.nl', 'no\.mirago\.com', 'mirago\.se', 'mirago\.co\.uk', 'mirago', 'answerbus\.com', 'icq\.com\/search', 'nusearch\.com', 'goodsearch\.com', 'scroogle\.org', 'questionanswering\.com', 'mywebsearch\.com', 'as\.starware\.com', 'del\.icio\.us', 'digg\.com', 'stumbleupon\.com', 'swik\.net', 'segnalo\.alice\.it', 'ineffabile\.it', 'anzwers\.com\.au', 'engine\.exe', 'miner\.bol\.com\.br', '\.baidu\.com', '\.vnet\.cn', '\.soso\.com', '\.sogou\.com', '\.3721\.com', 'iask\.com', '\.accoona\.com', '\.163\.com', '\.zhongsou\.com', 'atlas\.cz', 'seznam\.cz', 'quick\.cz', 'centrum\.cz', 'jyxo\.(cz|com)', 'najdi\.to', 'redbox\.cz', 'isearch\.avg\.com', 'opasia\.dk', 'danielsen\.com', 'sol\.dk', 'jubii\.dk', 'find\.dk', 'edderkoppen\.dk', 'netstjernen\.dk', 'orbis\.dk', 'tyfon\.dk', '1klik\.dk', 'ofir\.dk', 'ilse\.', 'vindex\.', '(^|\.)ask\.co\.uk', 'bbc\.co\.uk/cgi-bin/search', 'ifind\.freeserve', 'looksmart\.co\.uk', 'splut\.', 'spotjockey\.', 'ukdirectory\.', 'ukindex\.co\.uk', 'ukplus\.', 'searchy\.co\.uk', 'search\.fbdownloader\.com', 'search\.babylon\.com', 'haku\.www\.fi', 'recherche\.aol\.fr', 'ctrouve\.', 'francite\.', '\.lbb\.org', 'rechercher\.libertysurf\.fr', 'search[\w\-]+\.free\.fr', 'recherche\.club-internet\.fr', 'toile\.com', 'biglotron\.com', 'mozbot\.fr', 'sucheaol\.aol\.de', 'o2suche\.aol\.de', 'fireball\.de', 'infoseek\.de', 'suche\d?\.web\.de', '[a-z]serv\.rrzn\.uni-hannover\.de', 'suchen\.abacho\.de', '(brisbane|suche)\.t-online\.de', 'allesklar\.de', 'meinestadt\.de', '212\.227\.33\.241', '(161\.58\.227\.204|161\.58\.247\.101|212\.40\.165\.90|213\.133\.108\.202|217\.160\.108\.151|217\.160\.111\.99|217\.160\.131\.108|217\.160\.142\.227|217\.160\.176\.42)', 'wwweasel\.de', 'netluchs\.de', 'schoenerbrausen\.de', 'suche\.gmx\.net', 'ecosia\.org', 'de\.aolsearch\.com', 'suche\.aol\.de', 'www\.startxxl\.com', 'www\.benefind\.de', 'heureka\.hu', 'vizsla\.origo\.hu', 'lapkereso\.hu', 'goliat\.hu', 'index\.hu', 'wahoo\.hu', 'webmania\.hu', 'search\.internetto\.hu', 'tango\.hu', 'keresolap\.hu', 'polymeta\.hu', 'sify\.com', 'virgilio\.it', 'arianna\.libero\.it', 'supereva\.com', 'kataweb\.it', 'search\.alice\.it\.master', 'search\.alice\.it', 'gotuneed\.com', 'godado', 'jumpy\.it', 'shinyseek\.it', 'teecno\.it', 'search\.genieo\.com', 'ask\.jp', 'sagool\.jp', 'sok\.start\.no', 'eniro\.no', 'szukaj\.wp\.pl', 'szukaj\.onet\.pl', 'dodaj\.pl', 'gazeta\.pl', 'gery\.pl', 'hoga\.pl', 'netsprint\.pl', 'interia\.pl', 'katalog\.onet\.pl', 'o2\.pl', 'polska\.pl', 'szukacz\.pl', 'wow\.pl', 'ya(ndex)?\.ru', 'aport\.ru', 'rambler\.ru', 'turtle\.ru', 'metabot\.ru', 'evreka\.passagen\.se', 'eniro\.se', 'zoznam\.sk', 'sapo\.pt', 'search\.ch', 'search\.bluewin\.ch', 'pogodak\.', 'jwss\.cc', 'lemoteur\.orange\.fr', 'windowssearch\.com', 'qwant\.com', 'wow\.com', 'duckduckgo\.com', 'searches\.omiga-plus\.com', 'buenosearch\.com', 'searches\.vi-view\.com'] -not_search_engines_keys = {'tiscali\.' : 'mail\.tiscali\.', 'altavista\.' : 'babelfish\.altavista\.', 'yahoo\.' : '(?:picks|mail)\.yahoo\.|yahoo\.[^/]+/picks', 'google\.' : 'translate\.google\.', 'msn\.' : 'hotmail\.msn\.', 'yandex\.' : 'direct\.yandex\.'} +not_search_engines_keys = {'yahoo\.' : '(?:picks|mail)\.yahoo\.|yahoo\.[^/]+/picks', 'msn\.' : 'hotmail\.msn\.', 'google\.' : 'translate\.google\.', 'tiscali\.' : 'mail\.tiscali\.', 'yandex\.' : 'direct\.yandex\.', 'altavista\.' : 'babelfish\.altavista\.'} -search_engines_hashid = {'recherche\.aol\.fr' : 'aolfr', 'google\.' : 'google', 'engine\.exe' : 'engine', 'netsprint\.pl\/hoga\-search' : 'hogapl', 'search\.fbdownloader\.com' : 'fbdownloader', 'chello\.pl' : 'chellopl', 'suche\.gmx\.net' : 'gmxsuche', '\.baidu\.com' : 'baidu', 'ya(ndex)?\.ru' : 'yandex', 'i-une\.com' : 'iune', 'edderkoppen\.dk' : 'edderkoppen', 'mirago\.dk' : 'miragodk', 'biglotron\.com' : 'biglotron', 'infoseek\.de' : 'infoseek', 'findarticles\.com' : 'findarticles', 'chello\.se' : 'chellose', 'suche\d?\.web\.de' : 'webde', 'goliat\.hu' : 'goliat', 'meinestadt\.de' : 'meinestadt', '\.accoona\.com' : 'accoona', 'nl\.ask.\com' : 'asknl', 'infospace\.com' : 'infospace', 'mysearch\.' : 'mysearch', 'francite\.' : 'francite', 'searchy\.co\.uk' : 'searchy', '(66\.218\.71\.225|216\.109\.117\.135|216\.109\.125\.130|66\.218\.69\.11)' : 'yahoo', 'iask\.com' : 'iask', 'googlee\.' : 'google', 'index\.hu' : 'indexhu', 'clusty\.com' : 'clusty', 'www\.startxxl\.com' : 'startxxl', 'search\.earthlink\.net' : 'earthlink', 'danielsen\.com' : 'danielsen', 'digg\.com' : 'digg', 'uk\.ask.\com' : 'askuk', 'mirago' : 'mirago', 'dodaj\.pl' : 'dodajpl', 'altavista\.' : 'altavista', 'chello\.no' : 'chellono', 'es\.mirago\.com' : 'miragoes', 'teoma\.' : 'teoma', 'isearch\.avg\.com' : 'avgsearch', 'search\..*\.\w+' : 'search', 'schoenerbrausen\.de' : 'schoenerbrausen', 'ineffabile\.it' : 'ineffabile', 'mozbot\.fr' : 'mozbot', 'atlas\.cz' : 'atlas', '1klik\.dk' : '1klik', 'de\.ask.\com' : 'askde', 'o2\.pl' : 'o2pl', '\.sogou\.com' : 'sogou', 'netluchs\.de' : 'netluchs', 'mindset\.research\.yahoo' : 'yahoo_mindset', 'search\.internetto\.hu' : 'internetto', 'search\.bluewin\.ch' : 'bluewin', 'images\.google\.' : 'google_image', 'mirago\.fr' : 'miragofr', 'nusearch\.com' : 'nusearch', 'stumbleupon\.com' : 'stumbleupon', 'o2suche\.aol\.de' : 'o2aolde', 'www\.benefind\.de' : 'benefind', 'search\.babylon\.com' : 'babylon', '(^|\.)ask\.com' : 'ask', 'teecno\.it' : 'teecnoit', 'yahoo\.' : 'yahoo', '\.3721\.com' : '3721', 'steady-search\.com' : 'steadysearch', 'sucheaol\.aol\.de' : 'aolde', '(brisbane|suche)\.t-online\.de' : 't-online', '216\.239\.5[0-9]\.104' : 'google_cache', 'chello\.hu' : 'chellohu', 'jubii\.dk' : 'jubii', 'www\.searchmobileonline\.com' : 'searchmobileonline', 'gotuneed\.com' : 'gotuneed', 'virgilio\.it' : 'virgilio', 'wwweasel\.de' : 'wwweasel', 'ledix\.net' : 'ledix', 'rambler\.ru' : 'rambler', 'arianna\.libero\.it' : 'arianna', 'ecosia\.org' : 'ecosiasearch', 'no\.mirago\.com' : 'miragono', 'as\.starware\.com' : 'comettoolbar', 'centrum\.cz' : 'centrum', 'mirago\.ch' : 'miragoch', 'supereva\.com' : 'supereva', 'groups\.google\.' : 'google_groups', 'spotjockey\.' : 'spotjockey', 'goggle\.co\.hu' : 'google', 'recherche\.club-internet\.fr' : 'clubinternet', 'toile\.com' : 'toile', 'centraldatabase\.org' : 'centraldatabase', 'ctrouve\.' : 'ctrouve', '(?:www[12]?|mixidj)\.delta-search\.com' : 'delta-search', 'search\.terra\.' : 'terra', 'blingo\.com' : 'blingo', 'rechercher\.libertysurf\.fr' : 'libertysurf', 'gery\.pl' : 'gerypl', 'avantfind\.com' : 'avantfind', 'godado' : 'godado', 'anzwers\.com\.au' : 'anzwers', 'scroogle\.org' : 'scroogle', 'eniro\.se' : 'enirose', 'chello\.cz' : 'chellocz', 'mamma\.' : 'mamma', 'sify\.com' : 'sify', '(^|\.)ask\.co\.uk' : 'askuk', 'netstjernen\.dk' : 'netstjernen', 'search\.ch' : 'searchch', 'answerbus\.com' : 'answerbus', 'alltheweb\.com' : 'alltheweb', 'netscape\.' : 'netscape', 'ask\.jp' : 'askjp', 'search\.alice\.it\.master' : 'aliceitmaster', 'chello\.fr' : 'chellofr', 'voila\.' : 'voila', 'del\.icio\.us' : 'delicious', 'mirago\.be' : 'miragobe', '\.zhongsou\.com' : 'zhongsou', 'chello' : 'chellocom', 'haku\.www\.fi' : 'haku', 'seznam\.cz' : 'seznam', 'webcrawler\.' : 'webcrawler', 'hotbot\.' : 'hotbot', 'looksmart\.co\.uk' : 'looksmartuk', 'bing\.' : 'bing', 'orbis\.dk' : 'orbis', 'froogle\.google\.' : 'google_froogle', 'int\.search-results\.com' : 'nortonsavesearch', 'keresolap\.hu' : 'keresolap_hu', '216\.239\.(35|37|39|51)\.100' : 'google_cache', 'jyxo\.(cz|com)' : 'jyxo', 'suche\.aol\.de' : 'aolsuche', 'zoznam\.sk' : 'zoznam', 'mirago\.de' : 'miragode', '\.lbb\.org' : 'lbb', 'search\.genieo\.com' : 'genieo', 'shinyseek\.it' : 'shinyseek\.it', 'www\.holasearch\.com' : 'holasearch', 'excite\.' : 'excite', '216\.239\.(35|37|39|51)\.101' : 'google_cache', 'swik\.net' : 'swik', '66\.249\.93\.104' : 'google_cache', 'miner\.bol\.com\.br' : 'miner', '\.163\.com' : 'netease', '\.vnet\.cn' : 'vnet', 'pogodak\.' : 'pogodak', 'go2net\.com' : 'go2net', 'dogpile\.com' : 'dogpile', 'live\.com' : 'live', 'claro-search\.com' : 'clarosearch', 'nbci\.com\/search' : 'nbci', 'search\.alice\.it' : 'aliceit', 'evreka\.passagen\.se' : 'passagen', 'tiscali\.' : 'tiscali', 'copernic\.com' : 'copernic', 'overture\.com' : 'overture', 'search\.sli\.sympatico\.ca' : 'sympatico', 'fr\.ask.\com' : 'askfr', 'alexa\.com' : 'alexa', 'find\.dk' : 'finddk', '(161\.58\.227\.204|161\.58\.247\.101|212\.40\.165\.90|213\.133\.108\.202|217\.160\.108\.151|217\.160\.111\.99|217\.160\.131\.108|217\.160\.142\.227|217\.160\.176\.42)' : 'metacrawler_de', 'msn\.' : 'msn', 'search\.conduit\.com' : 'conduit', 'sapo\.pt' : 'sapo', 'ukplus\.' : 'ukplus', 'looksmart\.' : 'looksmart', 'sol\.dk' : 'sol', 'kataweb\.it' : 'kataweb', 'interia\.pl' : 'interiapl', 'polymeta\.hu' : 'polymeta_hu', 'chello\.sk' : 'chellosk', 'search[\w\-]+\.free\.fr' : 'free', 'metabot\.ru' : 'metabot', 'netsprint\.pl' : 'netsprintpl', 'lapkereso\.hu' : 'lapkereso', 'wisenut\.com' : 'wisenut', 'tango\.hu' : 'tango_hu', 'mywebsearch\.com' : 'mywebsearch', 'eniro\.no' : 'eniro', 'szukaj\.onet\.pl' : 'onetpl', '\.soso\.com' : 'soso', 'segnalo\.alice\.it' : 'segnalo', 'splut\.' : 'splut', 'fireball\.de' : 'fireball', 'vindex\.' : 'vindex', 'dmoz\.org' : 'dmoz', 'search\.aol\.co' : 'aol', 'goodsearch\.com' : 'goodsearch', '[a-z]serv\.rrzn\.uni-hannover\.de' : 'meta', 'bungeebonesdotcom' : 'bungeebonesdotcom', 'ofir\.dk' : 'ofir', 'ifind\.freeserve' : 'freeserve', 'de\.aolsearch\.com' : 'aolsearch', 'mirago\.se' : 'miragose', 'att\.net' : 'att', 'www\.search\.com' : 'search.com', 'chello\.be' : 'chellobe', 'ixquick\.com' : 'ixquick', 'szukaj\.wp\.pl' : 'wp', 'katalog\.onet\.pl' : 'katalogonetpl', 'vivisimo\.com' : 'vivisimo', 'northernlight\.' : 'northernlight', 'turtle\.ru' : 'turtle', 'wow\.pl' : 'wowpl', '(^|\.)go\.com' : 'go', 'szukacz\.pl' : 'szukaczpl', 'metacrawler\.' : 'metacrawler', 'googlecom\.com' : 'google', 'dejanews\.' : 'dejanews', 'mirago\.it' : 'miragoit', '64\.233\.1[0-9]{2}\.104' : 'google_cache', 'wahoo\.hu' : 'wahoo', 'mirago\.nl' : 'miragonl', 'a9\.com' : 'a9', 'suchen\.abacho\.de' : 'abacho', 'bbc\.co\.uk/cgi-bin/search' : 'bbc', 'questionanswering\.com' : 'questionanswering', 'najdi\.to' : 'najdi', 'jumpy\.it' : 'jumpy\.it', 'aport\.ru' : 'aport', 'vizsla\.origo\.hu' : 'origo', 'spray\.' : 'spray', 'sphere\.com' : 'sphere', 'steadysearch\.com' : 'steadysearch', '66\.102\.[1-9]\.104' : 'google_cache', 'chello\.nl' : 'chellonl', 'atomz\.' : 'atomz', 'google\.[\w.]+/products' : 'google_products', 'redbox\.cz' : 'redbox', 'lycos\.' : 'lycos', 'chello\.at' : 'chelloat', 'quick\.cz' : 'quick', 'kartoo\.com' : 'kartoo', 'icerocket\.com' : 'icerocket', 'mirago\.co\.uk' : 'miragocouk', 'gazeta\.pl' : 'gazetapl', 'start\.shaw\.ca' : 'shawca', 'allesklar\.de' : 'allesklar', 'polska\.pl' : 'polskapl', 'start\.iminent\.com' : 'iminent', 'tyfon\.dk' : 'tyfon', 'heureka\.hu' : 'heureka', 'webmania\.hu' : 'webmania', 'es\.ask.\com' : 'askes', 'opasia\.dk' : 'opasia', 'euroseek\.' : 'euroseek', 'ilse\.' : 'ilse', 'it\.ask.\com' : 'askit', 'base\.google\.' : 'google_base', '4\-counter\.com' : 'google4counter', '212\.227\.33\.241' : 'metaspinner', 'sok\.start\.no' : 'start', 'ukindex\.co\.uk' : 'ukindex', 'static\.flipora\.com' : 'flipora', 'ukdirectory\.' : 'ukdirectory', 'searchalot\.com' : 'searchalot', 'sagool\.jp' : 'sagool', 'www1\.search-results\.com' : 'searchresults', 'kvasir\.' : 'kvasir', 'icq\.com\/search' : 'icq', '72\.14\.2[0-9]{2}\.104' : 'google_cache', 'www.sfr\.fr\/recherche\/google' : 'google', 'searches\.omiga-plus\.com' : 'Omiga-plus', 'lemoteur\.orange\.fr' : 'Orange', 'searches\.vi-view\.com' : 'vi-view', 'qwant\.com' : 'Qwant', 'buenosearch\.com' : 'Bueno Search', 'wow\.com' : 'WOW', 'windowssearch\.com' : 'Windows Search', 'jwss\.cc' : 'jws'} +search_engines_hashid = {'mirago\.be' : 'miragobe', 'search\.aol\.co' : 'aol', 'zoznam\.sk' : 'zoznam', 'engine\.exe' : 'engine', 'mywebsearch\.com' : 'mywebsearch', 'goliat\.hu' : 'goliat', 'danielsen\.com' : 'danielsen', 'recherche\.aol\.fr' : 'aolfr', 'schoenerbrausen\.de' : 'schoenerbrausen', 'bing\.' : 'bing', 'i-une\.com' : 'iune', 'bbc\.co\.uk/cgi-bin/search' : 'bbc', 'vindex\.' : 'vindex', '(^|\.)ask\.co\.uk' : 'askuk', 'mindset\.research\.yahoo' : 'yahoo_mindset', 'sify\.com' : 'sify', '(161\.58\.227\.204|161\.58\.247\.101|212\.40\.165\.90|213\.133\.108\.202|217\.160\.108\.151|217\.160\.111\.99|217\.160\.131\.108|217\.160\.142\.227|217\.160\.176\.42)' : 'metacrawler_de', 'o2suche\.aol\.de' : 'o2aolde', 'najdi\.to' : 'najdi', 'szukacz\.pl' : 'szukaczpl', 'ilse\.' : 'ilse', 'questionanswering\.com' : 'questionanswering', 'toile\.com' : 'toile', 'jyxo\.(cz|com)' : 'jyxo', 'mirago\.co\.uk' : 'miragocouk', 'edderkoppen\.dk' : 'edderkoppen', 'scroogle\.org' : 'scroogle', '(?:www[12]?|mixidj)\.delta-search\.com' : 'delta-search', '\.accoona\.com' : 'accoona', 'mirago\.dk' : 'miragodk', 'mirago\.it' : 'miragoit', 'eniro\.se' : 'enirose', 'images\.google\.' : 'google_image', 'nbci\.com\/search' : 'nbci', 'searchy\.co\.uk' : 'searchy', 'chello\.se' : 'chellose', 'fr\.ask.\com' : 'askfr', 'de\.aolsearch\.com' : 'aolsearch', 'froogle\.google\.' : 'google_froogle', 'metacrawler\.' : 'metacrawler', 'live\.com' : 'live', 'suchen\.abacho\.de' : 'abacho', 'ineffabile\.it' : 'ineffabile', 'www\.benefind\.de' : 'benefind', 'vizsla\.origo\.hu' : 'origo', 'as\.starware\.com' : 'comettoolbar', 'steady-search\.com' : 'steadysearch', 'orbis\.dk' : 'orbis', '\.3721\.com' : '3721', 'bungeebonesdotcom' : 'bungeebonesdotcom', 'heureka\.hu' : 'heureka', 'dmoz\.org' : 'dmoz', 'webmania\.hu' : 'webmania', 'francite\.' : 'francite', 'www\.holasearch\.com' : 'holasearch', 'looksmart\.' : 'looksmart', 'lycos\.' : 'lycos', 'arianna\.libero\.it' : 'arianna', 'spotjockey\.' : 'spotjockey', 'www\.searchmobileonline\.com' : 'searchmobileonline', 'uk\.ask.\com' : 'askuk', 'miner\.bol\.com\.br' : 'miner', 'segnalo\.alice\.it' : 'segnalo', 'biglotron\.com' : 'biglotron', 'chello\.at' : 'chelloat', '(^|\.)ask\.com' : 'ask', 'goodsearch\.com' : 'goodsearch', 'ixquick\.com' : 'ixquick', 'overture\.com' : 'overture', 'interia\.pl' : 'interiapl', 'centraldatabase\.org' : 'centraldatabase', 'chello\.cz' : 'chellocz', 'vivisimo\.com' : 'vivisimo', 'lapkereso\.hu' : 'lapkereso', 'google\.[\w.]+/products' : 'google_products', 'groups\.google\.' : 'google_groups', 'search\.fbdownloader\.com' : 'fbdownloader', 'mirago\.nl' : 'miragonl', 'msn\.' : 'msn', 'nusearch\.com' : 'nusearch', '66\.102\.[1-9]\.104' : 'google_cache', 'sucheaol\.aol\.de' : 'aolde', 'google\.' : 'google', 'chello\.sk' : 'chellosk', 'rambler\.ru' : 'rambler', 'start\.iminent\.com' : 'iminent', 'polymeta\.hu' : 'polymeta_hu', 'wwweasel\.de' : 'wwweasel', 'googlecom\.com' : 'google', 'static\.flipora\.com' : 'flipora', 'alexa\.com' : 'alexa', 'metabot\.ru' : 'metabot', 'ask\.jp' : 'askjp', 'ecosia\.org' : 'ecosiasearch', 'search\.internetto\.hu' : 'internetto', '\.163\.com' : 'netease', '(66\.218\.71\.225|216\.109\.117\.135|216\.109\.125\.130|66\.218\.69\.11)' : 'yahoo', 'szukaj\.wp\.pl' : 'wp', 'meinestadt\.de' : 'meinestadt', 'answerbus\.com' : 'answerbus', 'es\.ask.\com' : 'askes', 'find\.dk' : 'finddk', 'findarticles\.com' : 'findarticles', 'netluchs\.de' : 'netluchs', 'index\.hu' : 'indexhu', 'chello\.fr' : 'chellofr', 'tiscali\.' : 'tiscali', 'it\.ask.\com' : 'askit', 'stumbleupon\.com' : 'stumbleupon', 'de\.ask.\com' : 'askde', 'euroseek\.' : 'euroseek', 'sapo\.pt' : 'sapo', '72\.14\.2[0-9]{2}\.104' : 'google_cache', 'steadysearch\.com' : 'steadysearch', 'ofir\.dk' : 'ofir', 'blingo\.com' : 'blingo', 'mozbot\.fr' : 'mozbot', 'search\.terra\.' : 'terra', 'icq\.com\/search' : 'icq', '64\.233\.1[0-9]{2}\.104' : 'google_cache', 'aport\.ru' : 'aport', 'quick\.cz' : 'quick', 'godado' : 'godado', 'northernlight\.' : 'northernlight', 'suche\.aol\.de' : 'aolsuche', 'netsprint\.pl' : 'netsprintpl', 'dogpile\.com' : 'dogpile', 'ukplus\.' : 'ukplus', '216\.239\.(35|37|39|51)\.101' : 'google_cache', 'wahoo\.hu' : 'wahoo', 'voila\.' : 'voila', 'katalog\.onet\.pl' : 'katalogonetpl', '4\-counter\.com' : 'google4counter', 'shinyseek\.it' : 'shinyseek\.it', 'base\.google\.' : 'google_base', '\.baidu\.com' : 'baidu', 'pogodak\.' : 'pogodak', 'search\.babylon\.com' : 'babylon', 'teecno\.it' : 'teecnoit', 'evreka\.passagen\.se' : 'passagen', 'atlas\.cz' : 'atlas', 'icerocket\.com' : 'icerocket', 'opasia\.dk' : 'opasia', 'chello\.hu' : 'chellohu', 'suche\.gmx\.net' : 'gmxsuche', 'webcrawler\.' : 'webcrawler', 'keresolap\.hu' : 'keresolap_hu', 'go2net\.com' : 'go2net', '(^|\.)go\.com' : 'go', 'claro-search\.com' : 'clarosearch', 'search\.alice\.it' : 'aliceit', 'seznam\.cz' : 'seznam', 'yahoo\.' : 'yahoo', 'clusty\.com' : 'clusty', 'tyfon\.dk' : 'tyfon', 'start\.shaw\.ca' : 'shawca', 'dejanews\.' : 'dejanews', 'szukaj\.onet\.pl' : 'onetpl', 'sphere\.com' : 'sphere', '(brisbane|suche)\.t-online\.de' : 't-online', 'att\.net' : 'att', 'chello\.nl' : 'chellonl', 'tango\.hu' : 'tango_hu', 'ya(ndex)?\.ru' : 'yandex', 'turtle\.ru' : 'turtle', 'altavista\.' : 'altavista', 'int\.search-results\.com' : 'nortonsavesearch', 'search\.alice\.it\.master' : 'aliceitmaster', 'netstjernen\.dk' : 'netstjernen', 'iask\.com' : 'iask', 'polska\.pl' : 'polskapl', 'infospace\.com' : 'infospace', 'netscape\.' : 'netscape', '66\.249\.93\.104' : 'google_cache', 'www\.startxxl\.com' : 'startxxl', '\.lbb\.org' : 'lbb', 'chello\.be' : 'chellobe', 'jubii\.dk' : 'jubii', 'ukindex\.co\.uk' : 'ukindex', 'netsprint\.pl\/hoga\-search' : 'hogapl', 'no\.mirago\.com' : 'miragono', '\.zhongsou\.com' : 'zhongsou', 'anzwers\.com\.au' : 'anzwers', 'avantfind\.com' : 'avantfind', 'ctrouve\.' : 'ctrouve', 'digg\.com' : 'digg', 'goggle\.co\.hu' : 'google', 'copernic\.com' : 'copernic', 'mirago\.ch' : 'miragoch', 'ledix\.net' : 'ledix', 'mysearch\.' : 'mysearch', 'wow\.pl' : 'wowpl', 'mirago' : 'mirago', 'mirago\.fr' : 'miragofr', 'swik\.net' : 'swik', 'searchalot\.com' : 'searchalot', '212\.227\.33\.241' : 'metaspinner', 'looksmart\.co\.uk' : 'looksmartuk', '[a-z]serv\.rrzn\.uni-hannover\.de' : 'meta', 'alltheweb\.com' : 'alltheweb', 'mirago\.se' : 'miragose', 'del\.icio\.us' : 'delicious', 'search[\w\-]+\.free\.fr' : 'free', '\.sogou\.com' : 'sogou', 'a9\.com' : 'a9', 'wisenut\.com' : 'wisenut', 'chello\.pl' : 'chellopl', '1klik\.dk' : '1klik', 'rechercher\.libertysurf\.fr' : 'libertysurf', 'nl\.ask.\com' : 'asknl', 'search\.ch' : 'searchch', '216\.239\.5[0-9]\.104' : 'google_cache', 'dodaj\.pl' : 'dodajpl', 'search\..*\.\w+' : 'search', 'search\.earthlink\.net' : 'earthlink', '216\.239\.(35|37|39|51)\.100' : 'google_cache', 'gotuneed\.com' : 'gotuneed', 'supereva\.com' : 'supereva', 'recherche\.club-internet\.fr' : 'clubinternet', 'allesklar\.de' : 'allesklar', 'chello' : 'chellocom', 'es\.mirago\.com' : 'miragoes', 'redbox\.cz' : 'redbox', 'jumpy\.it' : 'jumpy\.it', '\.soso\.com' : 'soso', 'gery\.pl' : 'gerypl', 'ukdirectory\.' : 'ukdirectory', 'chello\.no' : 'chellono', 'mamma\.' : 'mamma', 'kartoo\.com' : 'kartoo', '\.vnet\.cn' : 'vnet', 'search\.bluewin\.ch' : 'bluewin', 'teoma\.' : 'teoma', 'kvasir\.' : 'kvasir', 'hotbot\.' : 'hotbot', 'gazeta\.pl' : 'gazetapl', 'googlee\.' : 'google', 'ifind\.freeserve' : 'freeserve', 'sol\.dk' : 'sol', 'suche\d?\.web\.de' : 'webde', 'eniro\.no' : 'eniro', 'virgilio\.it' : 'virgilio', 'fireball\.de' : 'fireball', 'sok\.start\.no' : 'start', 'www1\.search-results\.com' : 'searchresults', 'o2\.pl' : 'o2pl', 'atomz\.' : 'atomz', 'search\.genieo\.com' : 'genieo', 'spray\.' : 'spray', 'kataweb\.it' : 'kataweb', 'sagool\.jp' : 'sagool', 'search\.sli\.sympatico\.ca' : 'sympatico', 'centrum\.cz' : 'centrum', 'www\.search\.com' : 'search.com', 'excite\.' : 'excite', 'search\.conduit\.com' : 'conduit', 'mirago\.de' : 'miragode', 'isearch\.avg\.com' : 'avgsearch', 'splut\.' : 'splut', 'infoseek\.de' : 'infoseek', 'haku\.www\.fi' : 'haku', 'lemoteur\.orange\.fr' : 'Orange', 'qwant\.com' : 'Qwant', 'wow\.com' : 'WOW', 'jwss\.cc' : 'jws', 'www.sfr\.fr\/recherche\/google' : 'google', 'searches\.omiga-plus\.com' : 'Omiga-plus', 'duckduckgo\.com' : 'DuckDuckGo', 'windowssearch\.com' : 'Windows Search', 'searches\.vi-view\.com' : 'vi-view', 'buenosearch\.com' : 'Bueno Search'} -search_engines_knwown_url = {'clusty' : 'query=', 'mywebsearch' : 'searchfor=', 'o2pl' : 'qt=', 'jubii' : 'soegeord=', 'finddk' : 'words=', 'chellono' : 'q1=', 'search.com' : 'q=', 'askuk' : '(ask|q)=', 'iminent' : 'q=', 'earthlink' : 'q=', 'passagen' : 'q=', 'miragobe' : '(txtsearch|qry)=', 'miragoit' : '(txtsearch|qry)=', 'danielsen' : 'q=', 'askde' : '(ask|q)=', 'looksmartuk' : 'key=', 'orbis' : 'search_field=', 'chellocz' : 'q1=', 'nusearch' : 'nusearch_terms=', 'searchmobileonline' : 'q=', 'avantfind' : 'keywords=', 'kartoo' : '', 'asknl' : '(ask|q)=', 'chellose' : 'q1=', 'teoma' : 'q=', 'bungeebonesdotcom' : 'query=', 'metacrawler_de' : 'qry=', '1klik' : 'query=', 'bing' : 'q=', 'mysearch' : 'searchfor=', 'aolsearch' : 'q=', 'yahoo_mindset' : 'p=', 'go' : 'qt=', 'wisenut' : 'query=', 'chellohu' : 'q1=', 'iune' : '(keywords|q)=', 'francite' : 'name=', 'gmxsuche' : 'q=', 'benefind' : 'q=', 'o2aolde' : 'q=', 'jyxo' : '(s|q)=', 'chellopl' : 'q1=', 'schoenerbrausen' : 'q=', 'findarticles' : 'key=', 'looksmart' : 'key=', 'conduit' : 'q=', 'google4counter' : '(p|q|as_p|as_q)=', 'google_image' : '(p|q|as_p|as_q)=', 'spray' : 'string=', 'baidu' : '(wd|word)=', 'mamma' : 'query=', 'chelloat' : 'q1=', 'ixquick' : 'query=', 'heureka' : 'heureka=', '3721' : '(p|name)=', 'questionanswering' : '', 'live' : 'q=', 'kataweb' : 'q=', 'aliceit' : 'qs=', 'google_products' : '(p|q|as_p|as_q)=', 'euroseek' : 'query=', 'sympatico' : 'query=', 'go2net' : 'general=', 'accoona' : 'qt=', 'netease' : 'q=', 'redbox' : 'srch=', 'sol' : 'q=', 'goodsearch' : 'Keywords=', 'miragoch' : '(txtsearch|qry)=', 'seznam' : '(w|q)=', 'chellonl' : 'q1=', 'start' : 'q=', 'zhongsou' : '(word|w)=', 'ecosiasearch' : 'q=', 'katalogonetpl' : 'qt=', 'nortonsavesearch' : 'q=', 'aolsuche' : 'q=', 'att' : 'qry=', 'delicious' : 'all=', 'origo' : '(q|search)=', 'jumpy\.it' : 'searchWord=', 'wwweasel' : 'q=', 'aliceitmaster' : 'qs=', 'sagool' : 'q=', 'flipora' : 'q=', 'gerypl' : 'q=', 'miragode' : '(txtsearch|qry)=', 'nbci' : 'keyword=', 'searchresults' : 'q=', 'centrum' : 'q=', 'engine' : 'p1=', 'tango_hu' : 'q=', 'netluchs' : 'query=', 'delta-search' : 'q=', 'icerocket' : 'q=', 'spotjockey' : 'Search_Keyword=', 'northernlight' : 'qr=', 'dodajpl' : 'keyword=', 'google_base' : '(p|q|as_p|as_q)=', 'google_cache' : '(p|q|as_p|as_q)=cache:[0-9A-Za-z]{12}:', 'blingo' : 'q=', 'google_froogle' : '(p|q|as_p|as_q)=', 'abacho' : 'q=', 'holasearch' : 'q=', 'fireball' : 'q=', 'google' : '(p|q|as_p|as_q)=', 'terra' : 'query=', 't-online' : 'q=', 'aol' : 'query=', 'lycos' : 'query=', 'edderkoppen' : 'query=', 'hogapl' : 'qt=', 'yandex' : 'text=', 'askjp' : '(ask|q)=', 'dmoz' : 'search=', 'chellocom' : 'q1=', 'goliat' : 'KERESES=', 'hotbot' : 'mt=', 'ukplus' : 'search=', 'anzwers' : 'search=', 'aport' : 'r=', 'avgsearch' : 'q=', 'centraldatabase' : 'query=', 'ilse' : 'search_for=', 'miragofr' : '(txtsearch|qry)=', 'metacrawler' : 'general=', 'infoseek' : 'qt=', 'aolde' : 'q=', 'interiapl' : 'q=', 'dogpile' : 'q(|kw)=', 'google_groups' : 'group\/', 'biglotron' : 'question=', 'startxxl' : 'q=', 'alexa' : 'q=', 'iask' : '(w|k)=', 'clarosearch' : 'q=', 'atlas' : '(searchtext|q)=', 'wahoo' : 'q=', 'toile' : 'q=', 'sphere' : 'q=', 'metabot' : 'st=', 'scroogle' : 'Gw=', 'mirago' : '(txtsearch|qry)=', 'alltheweb' : 'q(|uery)=', 'yahoo' : 'p=', 'pogodak' : 'q=', 'ukindex' : 'stext=', 'gazetapl' : 'slowo=', 'genieo' : 'q=', 'szukaczpl' : 'q=', 'steadysearch' : 'w=', 'gotuneed' : '', 'miner' : 'q=', 'virgilio' : 'qs=', 'miragodk' : '(txtsearch|qry)=', 'mozbot' : 'q=', 'wp' : 'szukaj=', 'swik' : 'swik\.net/', 'wowpl' : 'q=', 'najdi' : 'dotaz=', 'keresolap_hu' : 'q=', 'vivisimo' : 'query=', 'polymeta_hu' : '', 'kvasir' : 'q=', 'babylon' : 'q=', 'icq' : 'q=', 'comettoolbar' : 'qry=', 'vindex' : 'in=', 'atomz' : 'sp-q=', 'fbdownloader' : 'q=', 'ledix' : 'q=', 'ofir' : 'querytext=', 'chellobe' : 'q1=', 'answerbus' : '', 'miragoes' : '(txtsearch|qry)=', 'sogou' : 'query=', 'segnalo' : '', 'voila' : '(kw|rdata)=', 'msn' : 'q=', 'quick' : 'query=', 'webcrawler' : 'searchText=', 'searchch' : 'q=', 'internetto' : 'searchstr=', 'sify' : 'keyword=', 'arianna' : 'query=', 'splut' : 'pattern=', 'enirose' : 'q=', 'netscape' : 'search=', 'godado' : 'Keywords=', 'stumbleupon' : '', 'overture' : 'keywords=', 'netsprintpl' : 'q=', 'rambler' : 'words=', 'freeserve' : 'q=', 'chellofr' : 'q1=', 'askes' : '(ask|q)=', 'copernic' : 'web\/', 'polskapl' : 'qt=', 'bluewin' : 'qry=', 'ineffabile' : '', 'miragose' : '(txtsearch|qry)=', 'supereva' : 'q=', 'miragonl' : '(txtsearch|qry)=', 'metaspinner' : 'qry=', 'excite' : 'search=', 'miragocouk' : '(txtsearch|qry)=', 'ukdirectory' : 'k=', 'ask' : '(ask|q)=', 'opasia' : 'q=', 'bbc' : 'q=', 'a9' : 'a9\.com\/', 'eniro' : 'q=', 'askfr' : '(ask|q)=', 'askit' : '(ask|q)=', 'teecnoit' : 'q=', 'shawca' : 'q=', 'digg' : 's=', 'webde' : 'su=', 'searchalot' : 'q=', 'soso' : 'q=', 'shinyseek\.it' : 'KEY=', 'vnet' : 'kw=', 'clubinternet' : 'q=', 'miragono' : '(txtsearch|qry)=', 'chellosk' : 'q1=', 'tiscali' : 'key=', 'onetpl' : 'qt=', 'haku' : 'w=', 'altavista' : 'q=', 'infospace' : 'qkw=', 'searchy' : 'search_term=', 'vi-view' : 'q=', 'jws' : 'q=', 'WOW' : 'q=', 'Omiga-plus' : 'q=', 'Qwant' : 'q=', 'Windows Search' : 'q=', 'Bueno Search' : 'q=', 'Orange' : 'kw='} +search_engines_knwown_url = {'steadysearch' : 'w=', 'ledix' : 'q=', 'biglotron' : 'question=', 'centraldatabase' : 'query=', 'fbdownloader' : 'q=', 'seznam' : '(w|q)=', 'sphere' : 'q=', 'asknl' : '(ask|q)=', 'digg' : 's=', 'bbc' : 'q=', 'searchy' : 'search_term=', 'northernlight' : 'qr=', 'ukindex' : 'stext=', 'miragocouk' : '(txtsearch|qry)=', 'infoseek' : 'qt=', 'chellopl' : 'q1=', 'clusty' : 'query=', 'netease' : 'q=', 'flipora' : 'q=', 'metacrawler_de' : 'qry=', 'enirose' : 'q=', 'ask' : '(ask|q)=', 'mamma' : 'query=', 'ukdirectory' : 'k=', 'aliceit' : 'qs=', 'jyxo' : '(s|q)=', 'francite' : 'name=', 'conduit' : 'q=', 'blingo' : 'q=', 'chellosk' : 'q1=', 'miragono' : '(txtsearch|qry)=', 'avgsearch' : 'q=', 'miragose' : '(txtsearch|qry)=', 'bing' : 'q=', 'vindex' : 'in=', 'askes' : '(ask|q)=', 'nortonsavesearch' : 'q=', 'wowpl' : 'q=', 'wisenut' : 'query=', 'google_groups' : 'group\/', 'centrum' : 'q=', 'askde' : '(ask|q)=', 'internetto' : 'searchstr=', 'looksmart' : 'key=', 'wp' : 'szukaj=', 'live' : 'q=', 'aport' : 'r=', 'overture' : 'keywords=', 'gazetapl' : 'slowo=', 'freeserve' : 'q=', 'dmoz' : 'search=', 'holasearch' : 'q=', 'baidu' : '(wd|word)=', 'shawca' : 'q=', 'nbci' : 'keyword=', 'zhongsou' : '(word|w)=', 'avantfind' : 'keywords=', 'chellonl' : 'q1=', 'babylon' : 'q=', 'go' : 'qt=', 'tango_hu' : 'q=', 'metabot' : 'st=', 'euroseek' : 'query=', 'infospace' : 'qkw=', 'splut' : 'pattern=', 'goliat' : 'KERESES=', 'finddk' : 'words=', 'google_base' : '(p|q|as_p|as_q)=', 'szukaczpl' : 'q=', 'toile' : 'q=', 'tiscali' : 'key=', 'askit' : '(ask|q)=', 'askjp' : '(ask|q)=', 'comettoolbar' : 'qry=', 'danielsen' : 'q=', 'searchalot' : 'q=', 'soso' : 'q=', 'askuk' : '(ask|q)=', 'pogodak' : 'q=', 'kvasir' : 'q=', 'alltheweb' : 'q(|uery)=', 'teoma' : 'q=', 'bluewin' : 'qry=', 'sagool' : 'q=', 'najdi' : 'dotaz=', 'chellose' : 'q1=', 'vnet' : 'kw=', 'miragoch' : '(txtsearch|qry)=', 'start' : 'q=', 'findarticles' : 'key=', 'mozbot' : 'q=', 'chelloat' : 'q1=', 'heureka' : 'heureka=', 'chellohu' : 'q1=', 'goodsearch' : 'Keywords=', 'ecosiasearch' : 'q=', 'google_froogle' : '(p|q|as_p|as_q)=', 'a9' : 'a9\.com\/', 'bungeebonesdotcom' : 'query=', 'mysearch' : 'searchfor=', 'icq' : 'q=', 'dodajpl' : 'keyword=', 'excite' : 'search=', 'voila' : '(kw|rdata)=', 'miragode' : '(txtsearch|qry)=', 'engine' : 'p1=', 'iminent' : 'q=', 'arianna' : 'query=', 'gerypl' : 'q=', 'lycos' : 'query=', 't-online' : 'q=', 'netscape' : 'search=', 'yahoo' : 'p=', 'aolde' : 'q=', '1klik' : 'query=', 'miragoes' : '(txtsearch|qry)=', 'orbis' : 'search_field=', 'answerbus' : '', 'anzwers' : 'search=', 'miragobe' : '(txtsearch|qry)=', 'mirago' : '(txtsearch|qry)=', 'teecnoit' : 'q=', 'fireball' : 'q=', 'jumpy\.it' : 'searchWord=', 'google_products' : '(p|q|as_p|as_q)=', 'looksmartuk' : 'key=', 'sify' : 'keyword=', 'accoona' : 'qt=', 'redbox' : 'srch=', 'webde' : 'su=', 'askfr' : '(ask|q)=', 'earthlink' : 'q=', 'schoenerbrausen' : 'q=', 'atlas' : '(searchtext|q)=', 'kartoo' : '', 'o2pl' : 'qt=', 'clubinternet' : 'q=', 'webcrawler' : 'searchText=', 'atomz' : 'sp-q=', 'jubii' : 'soegeord=', 'interiapl' : 'q=', 'go2net' : 'general=', '3721' : '(p|name)=', 'segnalo' : '', 'abacho' : 'q=', 'wahoo' : 'q=', 'edderkoppen' : 'query=', 'gmxsuche' : 'q=', 'metacrawler' : 'general=', 'ixquick' : 'query=', 'hogapl' : 'qt=', 'polskapl' : 'qt=', 'mywebsearch' : 'searchfor=', 'yandex' : 'text=', 'searchch' : 'q=', 'genieo' : 'q=', 'att' : 'qry=', 'supereva' : 'q=', 'search.com' : 'q=', 'icerocket' : 'q=', 'google' : '(p|q|as_p|as_q)=', 'aolsuche' : 'q=', 'ineffabile' : '', 'swik' : 'swik\.net/', 'aliceitmaster' : 'qs=', 'eniro' : 'q=', 'spray' : 'string=', 'dogpile' : 'q(|kw)=', 'opasia' : 'q=', 'quick' : 'query=', 'miragoit' : '(txtsearch|qry)=', 'netluchs' : 'query=', 'onetpl' : 'qt=', 'wwweasel' : 'q=', 'sol' : 'q=', 'godado' : 'Keywords=', 'google_cache' : '(p|q|as_p|as_q)=cache:[0-9A-Za-z]{12}:', 'spotjockey' : 'Search_Keyword=', 'aolsearch' : 'q=', 'origo' : '(q|search)=', 'sympatico' : 'query=', 'netsprintpl' : 'q=', 'msn' : 'q=', 'startxxl' : 'q=', 'iask' : '(w|k)=', 'gotuneed' : '', 'miragodk' : '(txtsearch|qry)=', 'virgilio' : 'qs=', 'google4counter' : '(p|q|as_p|as_q)=', 'metaspinner' : 'qry=', 'yahoo_mindset' : 'p=', 'copernic' : 'web\/', 'miragonl' : '(txtsearch|qry)=', 'shinyseek\.it' : 'KEY=', 'google_image' : '(p|q|as_p|as_q)=', 'searchresults' : 'q=', 'rambler' : 'words=', 'searchmobileonline' : 'q=', 'aol' : 'query=', 'haku' : 'w=', 'vivisimo' : 'query=', 'nusearch' : 'nusearch_terms=', 'ukplus' : 'search=', 'katalogonetpl' : 'qt=', 'questionanswering' : '', 'terra' : 'query=', 'o2aolde' : 'q=', 'chellocom' : 'q1=', 'polymeta_hu' : '', 'stumbleupon' : '', 'chellofr' : 'q1=', 'hotbot' : 'mt=', 'keresolap_hu' : 'q=', 'miner' : 'q=', 'chellocz' : 'q1=', 'altavista' : 'q=', 'delta-search' : 'q=', 'chellobe' : 'q1=', 'alexa' : 'q=', 'ilse' : 'search_for=', 'iune' : '(keywords|q)=', 'benefind' : 'q=', 'chellono' : 'q1=', 'kataweb' : 'q=', 'ofir' : 'querytext=', 'passagen' : 'q=', 'scroogle' : 'Gw=', 'sogou' : 'query=', 'delicious' : 'all=', 'miragofr' : '(txtsearch|qry)=', 'clarosearch' : 'q=', 'DuckDuckGo' : 'q=', 'Windows Search' : 'q=', 'WOW' : 'q=', 'Orange' : 'kw=', 'Bueno Search' : 'q=', 'Omiga-plus' : 'q=', 'vi-view' : 'q=', 'Qwant' : 'q=', 'jws' : 'q='} operating_systems = ['windows[_+ ]?2005', 'windows[_+ ]nt[_+ ]6\.0', 'windows[_+ ]?2008', 'windows[_+ ]nt[_+ ]6\.1', 'windows[_+ ]?2012', 'windows[_+ ]nt[_+ ]6\.2', 'windows[_+ ]?vista', 'windows[_+ ]nt[_+ ]6', 'windows[_+ ]?2003', 'windows[_+ ]nt[_+ ]5\.2', 'windows[_+ ]xp', 'windows[_+ ]nt[_+ ]5\.1', 'windows[_+ ]me', 'win[_+ ]9x', 'windows[_+ ]?2000', 'windows[_+ ]nt[_+ ]5', 'winnt', 'windows[_+ \-]?nt', 'win32', 'win(.*)98', 'win(.*)95', 'win(.*)16', 'windows[_+ ]3', 'win(.*)ce', 'mac[_+ ]os[_+ ]x[_+ ]10[_\.]9', 'mac[_+ ]os[_+ ]x[_+ ]10[_\.]8', 'mac[_+ ]os[_+ ]x[_+ ]10[_\.]7', 'mac[_+ ]os[_+ ]x[_+ ]10[_\.]6', 'mac[_+ ]os[_+ ]x[_+ ]10[_\.]5', 'mac[_+ ]os[_+ ]x[_+ ]10[_\.]4', 'mac[_+ ]os[_+ ]x', 'mac[_+ ]?p', 'mac[_+ ]68', 'macweb', 'macintosh', 'linux(.*)android', 'linux(.*)asplinux', 'linux(.*)centos', 'linux(.*)debian', 'linux(.*)fedora', 'linux(.*)gentoo', 'linux(.*)mandr', 'linux(.*)momonga', 'linux(.*)pclinuxos', 'linux(.*)red[_+ ]hat', 'linux(.*)suse', 'linux(.*)ubuntu', 'linux(.*)vector', 'linux(.*)vine', 'linux(.*)white\sbox', 'linux(.*)zenwalk', 'linux', 'gnu.hurd', 'bsdi', 'gnu.kfreebsd', 'freebsd', 'openbsd', 'netbsd', 'dragonfly', 'aix', 'sunos', 'irix', 'osf', 'hp\-ux', 'unix', 'x11', 'gnome\-vfs', 'beos', 'os/2', 'amiga', 'atari', 'vms', 'commodore', 'qnx', 'inferno', 'palmos', 'syllable', 'blackberry', 'cp/m', 'crayos', 'dreamcast', 'iphone[_+ ]os', 'risc[_+ ]?os', 'symbian', 'webtv', 'playstation', 'xbox', 'wii', 'vienna', 'newsfire', 'applesyndication', 'akregator', 'plagger', 'syndirella', 'j2me', 'java', 'microsoft', 'msie[_+ ]', 'ms[_+ ]frontpage', 'windows'] -operating_systems_hashid = {'qnx' : 'qnx', 'blackberry' : 'blackberry', 'linux(.*)suse' : 'linuxsuse', 'linux(.*)white\sbox' : 'linuxwhitebox', 'amiga' : 'amigaos', 'java' : 'java', 'linux(.*)momonga' : 'linuxmomonga', 'msie[_+ ]' : 'winunknown', 'symbian' : 'symbian', 'microsoft' : 'winunknown', 'beos' : 'beos', 'win(.*)ce' : 'wince', 'applesyndication' : 'macosx', 'playstation' : 'psp', 'windows[_+ ]me' : 'winme', 'gnu.hurd' : 'gnu', 'gnu.kfreebsd' : 'bsdkfreebsd', 'windows[_+ ]nt[_+ ]6' : 'winvista', 'syllable' : 'syllable', 'openbsd' : 'bsdopenbsd', 'unix' : 'unix', 'windows[_+ ]nt[_+ ]5\.2' : 'win2003', 'linux(.*)android' : 'linuxandroid', 'windows[_+ ]nt[_+ ]5\.1' : 'winxp', 'mac[_+ ]os[_+ ]x' : 'macosx', 'gnome\-vfs' : 'unix', 'windows[_+ ]nt[_+ ]6\.0' : 'winlong', 'palmos' : 'palmos', 'windows[_+ ]nt[_+ ]6\.1' : 'win7', 'sunos' : 'sunos', 'windows[_+ ]?2005' : 'winlong', 'newsfire' : 'macosx', 'vms' : 'vms', 'risc[_+ ]?os' : 'riscos', 'linux' : 'linux', 'ms[_+ ]frontpage' : 'winunknown', 'vienna' : 'macosx', 'mac[_+ ]68' : 'macintosh', 'mac[_+ ]os[_+ ]x[_+ ]10[_\.]7' : 'macosx7', 'windows[_+ ]nt[_+ ]5' : 'win2000', 'syndirella' : 'winxp', 'wii' : 'wii', 'irix' : 'irix', 'dragonflybsd' : 'bsddflybsd', 'windows' : 'winunknown', 'atari' : 'atari', 'netbsd' : 'bsdnetbsd', 'macintosh' : 'macintosh', 'plagger' : 'unix', 'x11' : 'unix', 'linux(.*)zenwalk' : 'linuxzenwalk', 'crayos' : 'crayos', 'dreamcast' : 'dreamcast', 'linux(.*)vine' : 'linuxvine', 'osf' : 'osf', 'akregator' : 'linux', 'mac[_+ ]os[_+ ]x[_+ ]10[_\.]8' : 'macosx8', 'mac[_+ ]os[_+ ]x[_+ ]10[_\.]6' : 'macosx6', 'win(.*)95' : 'win95', 'windows[_+ ]?vista' : 'winvista', 'os/2' : 'os/2', 'linux(.*)debian' : 'linuxdebian', 'webtv' : 'webtv', 'win[_+ ]9x' : 'winme', 'aix' : 'aix', 'cp/m' : 'cp/m', 'linux(.*)red[_+ ]hat' : 'linuxredhat', 'win(.*)16' : 'win16', 'mac[_+ ]os[_+ ]x[_+ ]10[_\.]5' : 'macosx5', 'linux(.*)asplinux' : 'linuxasplinux', 'inferno' : 'inferno', 'win(.*)98' : 'win98', 'bsdi' : 'bsdi', 'windows[_+ ]?2008' : 'win2008', 'freebsd' : 'bsdfreebsd', 'hp\-ux' : 'hp\-ux', 'windows[_+ ]xp' : 'winxp', 'commodore' : 'commodore', 'mac[_+ ]os[_+ ]x[_+ ]10[_\.]9' : 'macosx9', 'xbox' : 'winxbox', 'windows[_+ \-]?nt' : 'winnt', 'linux(.*)gentoo' : 'linuxgentoo', 'windows[_+ ]?2012' : 'win2012', 'macweb' : 'macintosh', 'winnt' : 'winnt', 'linux(.*)fedora' : 'linuxfedora', 'iphone[_+ ]os' : 'ios', 'win32' : 'winnt', 'windows[_+ ]?2000' : 'win2000', 'linux(.*)pclinuxos' : 'linuxpclinuxos', 'j2me' : 'j2me', 'windows[_+ ]3' : 'win16', 'linux(.*)vector' : 'linuxvector', 'mac[_+ ]?p' : 'macintosh', 'mac[_+ ]os[_+ ]x[_+ ]10[_\.]4' : 'macosx4', 'windows[_+ ]?2003' : 'win2003', 'linux(.*)mandr' : 'linuxmandr', 'linux(.*)ubuntu' : 'linuxubuntu', 'linux(.*)centos' : 'linuxcentos', 'windows[_+ ]nt[_+ ]6\.2' : 'win8'} +operating_systems_hashid = {'windows[_+ ]nt[_+ ]6\.2' : 'win8', 'os/2' : 'os/2', 'beos' : 'beos', 'dragonflybsd' : 'bsddflybsd', 'linux' : 'linux', 'playstation' : 'psp', 'winnt' : 'winnt', 'linux(.*)centos' : 'linuxcentos', 'linux(.*)red[_+ ]hat' : 'linuxredhat', 'aix' : 'aix', 'macintosh' : 'macintosh', 'vms' : 'vms', 'windows[_+ ]?2008' : 'win2008', 'linux(.*)debian' : 'linuxdebian', 'linux(.*)white\sbox' : 'linuxwhitebox', 'webtv' : 'webtv', 'wii' : 'wii', 'windows[_+ ]nt[_+ ]6\.0' : 'winlong', 'mac[_+ ]os[_+ ]x[_+ ]10[_\.]6' : 'macosx6', 'inferno' : 'inferno', 'netbsd' : 'bsdnetbsd', 'unix' : 'unix', 'mac[_+ ]os[_+ ]x[_+ ]10[_\.]4' : 'macosx4', 'applesyndication' : 'macosx', 'windows[_+ ]nt[_+ ]5\.1' : 'winxp', 'iphone[_+ ]os' : 'ios', 'amiga' : 'amigaos', 'newsfire' : 'macosx', 'windows[_+ ]nt[_+ ]6' : 'winvista', 'windows[_+ ]nt[_+ ]6\.1' : 'win7', 'win[_+ ]9x' : 'winme', 'java' : 'java', 'linux(.*)ubuntu' : 'linuxubuntu', 'commodore' : 'commodore', 'plagger' : 'unix', 'bsdi' : 'bsdi', 'microsoft' : 'winunknown', 'windows' : 'winunknown', 'linux(.*)pclinuxos' : 'linuxpclinuxos', 'mac[_+ ]os[_+ ]x[_+ ]10[_\.]7' : 'macosx7', 'j2me' : 'j2me', 'win32' : 'winnt', 'hp\-ux' : 'hp\-ux', 'windows[_+ ]?2003' : 'win2003', 'gnu.kfreebsd' : 'bsdkfreebsd', 'gnome\-vfs' : 'unix', 'windows[_+ ]3' : 'win16', 'linux(.*)gentoo' : 'linuxgentoo', 'ms[_+ ]frontpage' : 'winunknown', 'windows[_+ ]nt[_+ ]5\.2' : 'win2003', 'mac[_+ ]os[_+ ]x[_+ ]10[_\.]9' : 'macosx9', 'linux(.*)suse' : 'linuxsuse', 'atari' : 'atari', 'mac[_+ ]?p' : 'macintosh', 'windows[_+ ]me' : 'winme', 'openbsd' : 'bsdopenbsd', 'irix' : 'irix', 'linux(.*)fedora' : 'linuxfedora', 'mac[_+ ]68' : 'macintosh', 'win(.*)16' : 'win16', 'xbox' : 'winxbox', 'freebsd' : 'bsdfreebsd', 'mac[_+ ]os[_+ ]x' : 'macosx', 'x11' : 'unix', 'palmos' : 'palmos', 'mac[_+ ]os[_+ ]x[_+ ]10[_\.]5' : 'macosx5', 'syllable' : 'syllable', 'windows[_+ ]?vista' : 'winvista', 'syndirella' : 'winxp', 'linux(.*)vine' : 'linuxvine', 'crayos' : 'crayos', 'linux(.*)momonga' : 'linuxmomonga', 'sunos' : 'sunos', 'linux(.*)vector' : 'linuxvector', 'linux(.*)mandr' : 'linuxmandr', 'windows[_+ ]?2005' : 'winlong', 'akregator' : 'linux', 'qnx' : 'qnx', 'win(.*)95' : 'win95', 'mac[_+ ]os[_+ ]x[_+ ]10[_\.]8' : 'macosx8', 'windows[_+ ]?2012' : 'win2012', 'linux(.*)android' : 'linuxandroid', 'osf' : 'osf', 'linux(.*)zenwalk' : 'linuxzenwalk', 'symbian' : 'symbian', 'risc[_+ ]?os' : 'riscos', 'win(.*)98' : 'win98', 'macweb' : 'macintosh', 'windows[_+ ]xp' : 'winxp', 'gnu.hurd' : 'gnu', 'cp/m' : 'cp/m', 'dreamcast' : 'dreamcast', 'windows[_+ ]?2000' : 'win2000', 'vienna' : 'macosx', 'linux(.*)asplinux' : 'linuxasplinux', 'windows[_+ ]nt[_+ ]5' : 'win2000', 'windows[_+ \-]?nt' : 'winnt', 'win(.*)ce' : 'wince', 'blackberry' : 'blackberry', 'msie[_+ ]' : 'winunknown'} -operating_systems_family = {'linux' : 'Linux', 'bsd' : 'BSD', 'win' : 'Windows', 'mac' : 'Macintosh'} +operating_systems_family = {'linux' : 'Linux', 'mac' : 'Macintosh', 'bsd' : 'BSD', 'win' : 'Windows'} browsers = ['elinks', 'firebird', 'go!zilla', 'icab', 'links', 'lynx', 'omniweb', '22acidownload', 'abrowse', 'aol\-iweng', 'amaya', 'amigavoyager', 'arora', 'aweb', 'charon', 'donzilla', 'seamonkey', 'flock', 'minefield', 'bonecho', 'granparadiso', 'songbird', 'strata', 'sylera', 'kazehakase', 'prism', 'icecat', 'iceape', 'iceweasel', 'w3clinemode', 'bpftp', 'camino', 'chimera', 'cyberdog', 'dillo', 'xchaos_arachne', 'doris', 'dreamcast', 'xbox', 'downloadagent', 'ecatch', 'emailsiphon', 'encompass', 'epiphany', 'friendlyspider', 'fresco', 'galeon', 'flashget', 'freshdownload', 'getright', 'leechget', 'netants', 'headdump', 'hotjava', 'ibrowse', 'intergo', 'k\-meleon', 'k\-ninja', 'linemodebrowser', 'lotus\-notes', 'macweb', 'multizilla', 'ncsa_mosaic', 'netcaptor', 'netpositive', 'nutscrape', 'msfrontpageexpress', 'contiki', 'emacs\-w3', 'phoenix', 'shiira', 'tzgeturl', 'viking', 'webfetcher', 'webexplorer', 'webmirror', 'webvcr', 'qnx\svoyager', 'cloudflare', 'grabber', 'teleport', 'webcapture', 'webcopier', 'real', 'winamp', 'windows\-media\-player', 'audion', 'freeamp', 'itunes', 'jetaudio', 'mint_audio', 'mpg123', 'mplayer', 'nsplayer', 'qts', 'quicktime', 'sonique', 'uplayer', 'xaudio', 'xine', 'xmms', 'gstreamer', 'abilon', 'aggrevator', 'aiderss', 'akregator', 'applesyndication', 'betanews_reader', 'blogbridge', 'cyndicate', 'feeddemon', 'feedreader', 'feedtools', 'greatnews', 'gregarius', 'hatena_rss', 'jetbrains_omea', 'liferea', 'netnewswire', 'newsfire', 'newsgator', 'newzcrawler', 'plagger', 'pluck', 'potu', 'pubsub\-rss\-reader', 'pulpfiction', 'rssbandit', 'rssreader', 'rssowl', 'rss\sxpress', 'rssxpress', 'sage', 'sharpreader', 'shrook', 'straw', 'syndirella', 'vienna', 'wizz\srss\snews\sreader', 'alcatel', 'lg\-', 'mot\-', 'nokia', 'panasonic', 'philips', 'sagem', 'samsung', 'sie\-', 'sec\-', 'sonyericsson', 'ericsson', 'mmef', 'mspie', 'vodafone', 'wapalizer', 'wapsilon', 'wap', 'webcollage', 'up\.', 'android', 'blackberry', 'cnf2', 'docomo', 'ipcheck', 'iphone', 'portalmmm', 'webtv', 'democracy', 'cjb\.net', 'ossproxy', 'smallproxy', 'adobeair', 'apt', 'analogx_proxy', 'gnome\-vfs', 'neon', 'curl', 'csscheck', 'httrack', 'fdm', 'javaws', 'wget', 'fget', 'chilkat', 'webdownloader\sfor\sx', 'w3m', 'wdg_validator', 'w3c_validator', 'jigsaw', 'webreaper', 'webzip', 'staroffice', 'gnus', 'nikto', 'download\smaster', 'microsoft\-webdav\-miniredir', 'microsoft\sdata\saccess\sinternet\spublishing\sprovider\scache\smanager', 'microsoft\sdata\saccess\sinternet\spublishing\sprovider\sdav', 'POE\-Component\-Client\-HTTP', 'mozilla', 'libwww', 'lwp', 'WebSec'] -browsers_hashid = {'sie\-' : 'SIE (PDA/Phone browser)', 'gnus' : 'Gnus Network User Services', 'webcopier' : 'WebCopier', 'nokia' : 'Nokia Browser (PDA/Phone browser)', 'feedtools' : 'FeedTools (RSS Reader)', 'iceape' : 'GNU IceApe', 'xbox' : 'XBoX', 'lotus\-notes' : 'Lotus Notes web client', 'konqueror' : 'Konqueror', 'hatena_rss' : 'Hatena (RSS Reader)', 'feeddemon' : 'FeedDemon (RSS Reader)', 'bpftp' : 'BPFTP', 'macweb' : 'MacWeb', 'sonyericsson' : 'Sony/Ericsson Browser (PDA/Phone browser)', 'straw' : 'Straw (RSS Reader)', 'democracy' : 'Democracy', 'emacs\-w3' : 'Emacs/w3s', 'xaudio' : 'Some XAudio Engine based MPEG player (media player)', 'android' : 'Android browser (PDA/Phone browser)', 'linemodebrowser' : 'W3C Line Mode Browser', 'sylera' : 'Sylera', 'jetaudio' : 'JetAudio (media player)', 'alcatel' : 'Alcatel Browser (PDA/Phone browser)', 'amaya' : 'Amaya', 'k\-meleon' : 'K-Meleon', 'netnewswire' : 'NetNewsWire (RSS Reader)', 'jetbrains_omea' : 'Omea (RSS Reader)', 'windows\-media\-player' : 'Windows Media Player (media player)', 'sage' : 'Sage (RSS Reader)', 'netpositive' : 'NetPositive', 'webvcr' : 'WebVCR', 'rssbandit' : 'RSS Bandit (RSS Reader)', 'wapalizer' : 'WAPalizer (PDA/Phone browser)', 'arora' : 'Arora', 'w3c_validator' : 'W3C Validator', 'netcaptor' : 'NetCaptor', 'audion' : 'Audion (media player)', 'sec\-' : 'Sony/Ericsson (PDA/Phone browser)', 'lynx' : 'Lynx', 'aggrevator' : 'Aggrevator (RSS Reader)', 'cjb\.net' : 'CJB.NET Proxy', 'feedreader' : 'FeedReader (RSS Reader)', 'itunes' : 'Apple iTunes (media player)', 'bonecho' : 'BonEcho (Firefox 2.0 development)', 'mozilla' : 'Mozilla', 'ericsson' : 'Ericsson Browser (PDA/Phone browser)', 'phoenix' : 'Phoenix', 'grabber' : 'Grabber', 'dillo' : 'Dillo', 'charon' : 'Charon', 'prism' : 'Prism', 'apt' : 'Debian APT', 'wdg_validator' : 'WDG HTML Validator', 'msfrontpageexpress' : 'MS FrontPage Express', 'newzcrawler' : 'NewzCrawler (RSS Reader)', 'mint_audio' : 'Mint Audio (media player)', 'abilon' : 'Abilon (RSS Reader)', 'adobeair' : 'AdobeAir', 'microsoft\-webdav\-miniredir' : 'Microsoft Data Access Component Internet Publishing Provider', 'staroffice' : 'StarOffice', '22acidownload' : '22AciDownload', 'microsoft\sdata\saccess\sinternet\spublishing\sprovider\scache\smanager' : 'Microsoft Data Access Component Internet Publishing Provider Cache Manager', 'seamonkey' : 'SeaMonkey', 'friendlyspider' : 'FriendlySpider', 'shrook' : 'Shrook (RSS Reader)', 'mspie' : 'MS Pocket Internet Explorer (PDA/Phone browser)', 'blogbridge' : 'BlogBridge (RSS Reader)', 'fresco' : 'ANT Fresco', 'wizz\srss\snews\sreader' : 'Wizz RSS News Reader (RSS Reader)', 'docomo' : 'I-Mode phone (PDA/Phone browser)', 'winamp' : 'WinAmp (media player)', 'webtv' : 'WebTV browser', 'freshdownload' : 'FreshDownload', 'ecatch' : 'eCatch', 'webzip' : 'WebZIP', 'sonique' : 'Sonique (media player)', 'contiki' : 'Contiki', 'pluck' : 'Pluck (RSS Reader)', 'webcollage' : 'WebCollage (PDA/Phone browser)', 'netants' : 'NetAnts', 'wget' : 'Wget', 'webexplorer' : 'IBM-WebExplorer', 'sagem' : 'Sagem (PDA/Phone browser)', 'wap' : 'Unknown WAP browser (PDA/Phone browser)', 'nutscrape' : 'Nutscrape', 'svn' : 'Subversion client', 'plagger' : 'Plagger (RSS Reader)', 'hotjava' : 'Sun HotJava', 'gstreamer' : 'GStreamer (media library)', 'aiderss' : 'AideRSS (RSS Reader)', 'opera' : 'Opera', 'dreamcast' : 'Dreamcast', 'analogx_proxy' : 'AnalogX Proxy', 'webcapture' : 'Acrobat Webcapture', 'doris' : 'Doris (for Symbian)', 'flashget' : 'FlashGet', 'downloadagent' : 'DownloadAgent', 'portalmmm' : 'I-Mode phone (PDA/Phone browser)', 'songbird' : 'Songbird', 'firebird' : 'Firebird (Old Firefox)', 'newsgator' : 'NewsGator (RSS Reader)', 'javaws' : 'Java Web Start', 'microsoft\sdata\saccess\sinternet\spublishing\sprovider\sdav' : 'Microsoft Data Access Component Internet Publishing Provider DAV', 'iceweasel' : 'Iceweasel', 'uplayer' : 'Ultra Player (media player)', 'getright' : 'GetRight', 'chrome' : 'Google Chrome', 'ipcheck' : 'Supervision IP Check (phone)', 'xmms' : 'XMMS (media player)', 'akregator' : 'Akregator (RSS Reader)', 'w3m' : 'w3m', 'cyndicate' : 'Cyndicate (RSS Reader)', 'nsplayer' : 'NetShow Player (media player)', 'mplayer' : 'The Movie Player (media player)', 'elinks' : 'ELinks', 'mmef' : 'Microsoft Mobile Explorer (PDA/Phone browser)', 'greatnews' : 'GreatNews (RSS Reader)', 'go!zilla' : 'Go!Zilla', 'jigsaw' : 'W3C Validator', 'minefield' : 'Minefield (Firefox 3.0 development)', 'icab' : 'iCab', 'ossproxy' : 'OSSProxy', 'shiira' : 'Shiira', 'rssxpress' : 'RSSXpress (RSS Reader)', 'webmirror' : 'WebMirror', 'gregarius' : 'Gregarius (RSS Reader)', 'syndirella' : 'Syndirella (RSS Reader)', 'libwww' : 'LibWWW', 'icecat' : 'GNU IceCat', 'epiphany' : 'Epiphany', 'xchaos_arachne' : 'Arachne', 'flock' : 'Flock', 'k\-ninja' : 'K-Ninja', 'cnf2' : 'Supervision I-Mode ByTel (phone)', 'leechget' : 'LeechGet', 'webfetcher' : 'WebFetcher', 'sharpreader' : 'SharpReader (RSS Reader)', 'strata' : 'Strata', 'ncsa_mosaic' : 'NCSA Mosaic', 'lwp' : 'LibWWW-perl', 'fget' : 'FGet', 'webreaper' : 'WebReaper', 'philips' : 'Philips Browser (PDA/Phone browser)', 'intergo' : 'InterGO', 'fdm' : 'FDM Free Download Manager', 'newsfire' : 'NewsFire (RSS Reader)', 'donzilla' : 'Donzilla', 'cyberdog' : 'Cyberdog', 'w3clinemode' : 'W3CLineMode', 'aweb' : 'AWeb', 'rss\sxpress' : 'RSS Xpress (RSS Reader)', 'netscape' : 'Netscape', 'firefox' : 'Firefox', 'vienna' : 'Vienna (RSS Reader)', 'curl' : 'Curl', 'lg\-' : 'LG (PDA/Phone browser)', 'liferea' : 'Liferea (RSS Reader)', 'rssreader' : 'RssReader (RSS Reader)', 'quicktime' : 'QuickTime (media player)', 'rssowl' : 'RSSOwl (RSS Reader)', 'potu' : 'Potu (RSS Reader)', 'real' : 'Real player or compatible (media player)', 'kazehakase' : 'Kazehakase', 'amigavoyager' : 'AmigaVoyager', 'nikto' : 'Nikto Web Scanner', 'samsung' : 'Samsung (PDA/Phone browser)', 'camino' : 'Camino', 'headdump' : 'HeadDump', 'mpg123' : 'mpg123 (media player)', 'ibrowse' : 'iBrowse', 'httrack' : 'HTTrack', 'betanews_reader' : 'Betanews Reader (RSS Reader)', 'multizilla' : 'MultiZilla', 'csscheck' : 'WDG CSS Validator', 'chilkat' : 'Chilkat', 'gnome\-vfs' : 'Gnome FileSystem Abstraction library', 'qnx\svoyager' : 'QNX Voyager', 'xine' : 'Xine, a free multimedia player (media player)', 'wapsilon' : 'WAPsilon (PDA/Phone browser)', 'omniweb' : 'OmniWeb', 'qts' : 'QuickTime (media player)', 'iphone' : 'IPhone (PDA/Phone browser)', 'download\smaster' : 'Download Master', 'chimera' : 'Chimera (Old Camino)', 'WebSec' : 'Web Secretary', 'viking' : 'Viking', 'links' : 'Links', 'galeon' : 'Galeon', 'aol\-iweng' : 'AOL-Iweng', 'neon' : 'Neon HTTP and WebDAV client library', 'blackberry' : 'BlackBerry (PDA/Phone browser)', 'POE\-Component\-Client\-HTTP' : 'HTTP user-agent for POE (portable networking framework for Perl)', 'emailsiphon' : 'EmailSiphon', 'pulpfiction' : 'PulpFiction (RSS Reader)', 'panasonic' : 'Panasonic Browser (PDA/Phone browser)', 'msie' : 'MS Internet Explorer', 'encompass' : 'Encompass', 'tzgeturl' : 'TzGetURL', 'up\.' : 'UP.Browser (PDA/Phone browser)', 'safari' : 'Safari', 'vodafone' : 'Vodaphone browser (PDA/Phone browser)', 'smallproxy' : 'SmallProxy', 'webdownloader\sfor\sx' : 'Downloader for X', 'cloudflare' : 'CloudFlare', 'freeamp' : 'FreeAmp (media player)', 'applesyndication' : 'AppleSyndication (RSS Reader)', 'teleport' : 'TelePort Pro', 'abrowse' : 'ABrowse', 'mot\-' : 'Motorola Browser (PDA/Phone browser)', 'granparadiso' : 'GranParadiso (Firefox 3.0 development)', 'pubsub\-rss\-reader' : 'PubSub (RSS Reader)'} +browsers_hashid = {'encompass' : 'Encompass', 'k\-ninja' : 'K-Ninja', 'ericsson' : 'Ericsson Browser (PDA/Phone browser)', 'doris' : 'Doris (for Symbian)', 'jigsaw' : 'W3C Validator', 'netpositive' : 'NetPositive', 'rssxpress' : 'RSSXpress (RSS Reader)', 'sonyericsson' : 'Sony/Ericsson Browser (PDA/Phone browser)', 'sage' : 'Sage (RSS Reader)', 'newsfire' : 'NewsFire (RSS Reader)', 'granparadiso' : 'GranParadiso (Firefox 3.0 development)', 'headdump' : 'HeadDump', 'httrack' : 'HTTrack', 'applesyndication' : 'AppleSyndication (RSS Reader)', 'winamp' : 'WinAmp (media player)', 'jetbrains_omea' : 'Omea (RSS Reader)', 'bpftp' : 'BPFTP', 'w3m' : 'w3m', 'cnf2' : 'Supervision I-Mode ByTel (phone)', 'galeon' : 'Galeon', 'blogbridge' : 'BlogBridge (RSS Reader)', 'liferea' : 'Liferea (RSS Reader)', 'dillo' : 'Dillo', 'microsoft\-webdav\-miniredir' : 'Microsoft Data Access Component Internet Publishing Provider', 'icab' : 'iCab', 'links' : 'Links', 'xmms' : 'XMMS (media player)', 'netscape' : 'Netscape', 'plagger' : 'Plagger (RSS Reader)', 'straw' : 'Straw (RSS Reader)', 'newsgator' : 'NewsGator (RSS Reader)', 'ncsa_mosaic' : 'NCSA Mosaic', 'itunes' : 'Apple iTunes (media player)', 'javaws' : 'Java Web Start', 'fget' : 'FGet', 'iphone' : 'IPhone (PDA/Phone browser)', 'cjb\.net' : 'CJB.NET Proxy', 'opera' : 'Opera', 'samsung' : 'Samsung (PDA/Phone browser)', 'amigavoyager' : 'AmigaVoyager', 'gnome\-vfs' : 'Gnome FileSystem Abstraction library', 'fdm' : 'FDM Free Download Manager', 'abilon' : 'Abilon (RSS Reader)', 'potu' : 'Potu (RSS Reader)', 'aol\-iweng' : 'AOL-Iweng', 'amaya' : 'Amaya', 'philips' : 'Philips Browser (PDA/Phone browser)', 'webcopier' : 'WebCopier', 'sec\-' : 'Sony/Ericsson (PDA/Phone browser)', 'curl' : 'Curl', 'cloudflare' : 'CloudFlare', 'songbird' : 'Songbird', 'webexplorer' : 'IBM-WebExplorer', 'csscheck' : 'WDG CSS Validator', 'apt' : 'Debian APT', 'webmirror' : 'WebMirror', 'cyndicate' : 'Cyndicate (RSS Reader)', 'go!zilla' : 'Go!Zilla', 'wapsilon' : 'WAPsilon (PDA/Phone browser)', 'neon' : 'Neon HTTP and WebDAV client library', 'libwww' : 'LibWWW', 'intergo' : 'InterGO', 'strata' : 'Strata', 'donzilla' : 'Donzilla', 'freshdownload' : 'FreshDownload', 'sie\-' : 'SIE (PDA/Phone browser)', 'mot\-' : 'Motorola Browser (PDA/Phone browser)', 'nsplayer' : 'NetShow Player (media player)', 'epiphany' : 'Epiphany', 'nikto' : 'Nikto Web Scanner', 'elinks' : 'ELinks', 'webreaper' : 'WebReaper', 'flock' : 'Flock', 'microsoft\sdata\saccess\sinternet\spublishing\sprovider\sdav' : 'Microsoft Data Access Component Internet Publishing Provider DAV', '22acidownload' : '22AciDownload', 'download\smaster' : 'Download Master', 'chimera' : 'Chimera (Old Camino)', 'rssbandit' : 'RSS Bandit (RSS Reader)', 'qts' : 'QuickTime (media player)', 'real' : 'Real player or compatible (media player)', 'camino' : 'Camino', 'sylera' : 'Sylera', 'feeddemon' : 'FeedDemon (RSS Reader)', 'wdg_validator' : 'WDG HTML Validator', 'phoenix' : 'Phoenix', 'qnx\svoyager' : 'QNX Voyager', 'aweb' : 'AWeb', 'svn' : 'Subversion client', 'microsoft\sdata\saccess\sinternet\spublishing\sprovider\scache\smanager' : 'Microsoft Data Access Component Internet Publishing Provider Cache Manager', 'k\-meleon' : 'K-Meleon', 'downloadagent' : 'DownloadAgent', 'getright' : 'GetRight', 'omniweb' : 'OmniWeb', 'sonique' : 'Sonique (media player)', 'teleport' : 'TelePort Pro', 'webtv' : 'WebTV browser', 'bonecho' : 'BonEcho (Firefox 2.0 development)', 'jetaudio' : 'JetAudio (media player)', 'lotus\-notes' : 'Lotus Notes web client', 'pubsub\-rss\-reader' : 'PubSub (RSS Reader)', 'panasonic' : 'Panasonic Browser (PDA/Phone browser)', 'aggrevator' : 'Aggrevator (RSS Reader)', 'ecatch' : 'eCatch', 'shiira' : 'Shiira', 'nutscrape' : 'Nutscrape', 'mint_audio' : 'Mint Audio (media player)', 'prism' : 'Prism', 'xchaos_arachne' : 'Arachne', 'democracy' : 'Democracy', 'multizilla' : 'MultiZilla', 'webcollage' : 'WebCollage (PDA/Phone browser)', 'shrook' : 'Shrook (RSS Reader)', 'charon' : 'Charon', 'wizz\srss\snews\sreader' : 'Wizz RSS News Reader (RSS Reader)', 'pulpfiction' : 'PulpFiction (RSS Reader)', 'viking' : 'Viking', 'macweb' : 'MacWeb', 'mspie' : 'MS Pocket Internet Explorer (PDA/Phone browser)', 'sagem' : 'Sagem (PDA/Phone browser)', 'rssowl' : 'RSSOwl (RSS Reader)', 'emailsiphon' : 'EmailSiphon', 'up\.' : 'UP.Browser (PDA/Phone browser)', 'quicktime' : 'QuickTime (media player)', 'wap' : 'Unknown WAP browser (PDA/Phone browser)', 'netcaptor' : 'NetCaptor', 'mmef' : 'Microsoft Mobile Explorer (PDA/Phone browser)', 'mplayer' : 'The Movie Player (media player)', 'netants' : 'NetAnts', 'dreamcast' : 'Dreamcast', 'safari' : 'Safari', 'ipcheck' : 'Supervision IP Check (phone)', 'audion' : 'Audion (media player)', 'linemodebrowser' : 'W3C Line Mode Browser', 'uplayer' : 'Ultra Player (media player)', 'webcapture' : 'Acrobat Webcapture', 'vienna' : 'Vienna (RSS Reader)', 'arora' : 'Arora', 'msfrontpageexpress' : 'MS FrontPage Express', 'android' : 'Android browser (PDA/Phone browser)', 'ibrowse' : 'iBrowse', 'portalmmm' : 'I-Mode phone (PDA/Phone browser)', 'xaudio' : 'Some XAudio Engine based MPEG player (media player)', 'seamonkey' : 'SeaMonkey', 'rssreader' : 'RssReader (RSS Reader)', 'iceweasel' : 'Iceweasel', 'icecat' : 'GNU IceCat', 'staroffice' : 'StarOffice', 'blackberry' : 'BlackBerry (PDA/Phone browser)', 'alcatel' : 'Alcatel Browser (PDA/Phone browser)', 'analogx_proxy' : 'AnalogX Proxy', 'ossproxy' : 'OSSProxy', 'aiderss' : 'AideRSS (RSS Reader)', 'lg\-' : 'LG (PDA/Phone browser)', 'contiki' : 'Contiki', 'netnewswire' : 'NetNewsWire (RSS Reader)', 'cyberdog' : 'Cyberdog', 'hotjava' : 'Sun HotJava', 'firefox' : 'Firefox', 'gnus' : 'Gnus Network User Services', 'flashget' : 'FlashGet', 'w3c_validator' : 'W3C Validator', 'gstreamer' : 'GStreamer (media library)', 'wget' : 'Wget', 'msie' : 'MS Internet Explorer', 'WebSec' : 'Web Secretary', 'xine' : 'Xine, a free multimedia player (media player)', 'friendlyspider' : 'FriendlySpider', 'pluck' : 'Pluck (RSS Reader)', 'xbox' : 'XBoX', 'grabber' : 'Grabber', 'leechget' : 'LeechGet', 'iceape' : 'GNU IceApe', 'wapalizer' : 'WAPalizer (PDA/Phone browser)', 'webfetcher' : 'WebFetcher', 'newzcrawler' : 'NewzCrawler (RSS Reader)', 'abrowse' : 'ABrowse', 'POE\-Component\-Client\-HTTP' : 'HTTP user-agent for POE (portable networking framework for Perl)', 'betanews_reader' : 'Betanews Reader (RSS Reader)', 'konqueror' : 'Konqueror', 'rss\sxpress' : 'RSS Xpress (RSS Reader)', 'gregarius' : 'Gregarius (RSS Reader)', 'syndirella' : 'Syndirella (RSS Reader)', 'windows\-media\-player' : 'Windows Media Player (media player)', 'chilkat' : 'Chilkat', 'tzgeturl' : 'TzGetURL', 'sharpreader' : 'SharpReader (RSS Reader)', 'firebird' : 'Firebird (Old Firefox)', 'adobeair' : 'AdobeAir', 'feedtools' : 'FeedTools (RSS Reader)', 'lynx' : 'Lynx', 'webdownloader\sfor\sx' : 'Downloader for X', 'docomo' : 'I-Mode phone (PDA/Phone browser)', 'mpg123' : 'mpg123 (media player)', 'greatnews' : 'GreatNews (RSS Reader)', 'webvcr' : 'WebVCR', 'kazehakase' : 'Kazehakase', 'lwp' : 'LibWWW-perl', 'nokia' : 'Nokia Browser (PDA/Phone browser)', 'feedreader' : 'FeedReader (RSS Reader)', 'freeamp' : 'FreeAmp (media player)', 'chrome' : 'Google Chrome', 'akregator' : 'Akregator (RSS Reader)', 'hatena_rss' : 'Hatena (RSS Reader)', 'w3clinemode' : 'W3CLineMode', 'vodafone' : 'Vodaphone browser (PDA/Phone browser)', 'webzip' : 'WebZIP', 'emacs\-w3' : 'Emacs/w3s', 'mozilla' : 'Mozilla', 'fresco' : 'ANT Fresco', 'minefield' : 'Minefield (Firefox 3.0 development)', 'smallproxy' : 'SmallProxy'} -browsers_icons = {'staroffice' : 'staroffice', 'microsoft\sdata\saccess\sinternet\spublishing\sprovider\scache\smanager' : 'frontpage', 'seamonkey' : 'seamonkey', 'abilon' : 'abilon', 'adobeair' : 'adobe', 'microsoft\-webdav\-miniredir' : 'frontpage', 'mspie' : 'pdaphone', 'avantbrowser' : 'avant', 'shrook' : 'rss', 'prism' : 'mozilla', 'apt' : 'apt', 'mint_audio' : 'mediaplayer', 'msfrontpageexpress' : 'fpexpress', 'newzcrawler' : 'rss', 'wap' : 'pdaphone', 'svn' : 'subversion', 'winamp' : 'mediaplayer', 'docomo' : 'pdaphone', 'webtv' : 'webtv', 'ecatch' : 'ecatch', 'freshdownload' : 'freshdownload', 'webzip' : 'webzip', 'sonique' : 'mediaplayer', 'blogbridge' : 'rss', 'fresco' : 'fresco', 'wizz\srss\snews\sreader' : 'wizz', 'sagem' : 'pdaphone', 'pluck' : 'rss', 'webcollage' : 'pdaphone', 'flashget' : 'flashget', 'analogx_proxy' : 'analogx', 'webcapture' : 'adobe', 'doris' : 'doris', 'javaws' : 'java', 'microsoft\sdata\saccess\sinternet\spublishing\sprovider\sdav' : 'frontpage', 'portalmmm' : 'pdaphone', 'songbird' : 'mozilla', 'newsgator' : 'rss', 'firebird' : 'phoenix', 'hotjava' : 'hotjava', 'aiderss' : 'rss', 'plagger' : 'rss', 'dreamcast' : 'dreamcast', 'microsoft\soffice\sprotocol\sdiscovery' : 'frontpage', 'opera' : 'opera', 'nsplayer' : 'netshow', 'mmef' : 'pdaphone', 'greatnews' : 'rss', 'mplayer' : 'mediaplayer', 'getright' : 'getright', 'chrome' : 'chrome', 'uplayer' : 'mediaplayer', 'iceweasel' : 'iceweasel', 'akregator' : 'rss', 'microsoft\sdata\saccess\sinternet\spublishing\sprovider\sprotocol\sdiscovery' : 'frontpage', 'xmms' : 'mediaplayer', 'hatena_rss' : 'rss', 'feeddemon' : 'rss', 'microsoft\soffice\sexistence\sdiscovery' : 'frontpage', 'sonyericsson' : 'pdaphone', 'straw' : 'rss', 'bpftp' : 'bpftp', 'macweb' : 'macweb', 'webcopier' : 'webcopier', 'gnus' : 'gnus', 'nokia' : 'pdaphone', 'feedtools' : 'rss', 'xbox' : 'winxbox', 'iceape' : 'mozilla', 'lotus\-notes' : 'lotusnotes', 'sie\-' : 'pdaphone', 'konqueror' : 'konqueror', 'netnewswire' : 'rss', 'k\-meleon' : 'kmeleon', 'alcatel' : 'pdaphone', 'amaya' : 'amaya', 'sage' : 'rss', 'windows\-media\-player' : 'mplayer', 'netpositive' : 'netpositive', 'jetbrains_omea' : 'rss', 'jetaudio' : 'mediaplayer', 'xaudio' : 'mediaplayer', 'android' : 'android', 'sylera' : 'mozilla', 'sec\-' : 'pdaphone', 'audion' : 'mediaplayer', 'lynx' : 'lynx', 'aggrevator' : 'rss', 'cjb\.net' : 'cjbnet', 'rssbandit' : 'rss', 'wapalizer' : 'pdaphone', 'dillo' : 'dillo', 'itunes' : 'mediaplayer', 'feedreader' : 'rss', 'bonecho' : 'firefox', 'mozilla' : 'mozilla', 'ericsson' : 'pdaphone', 'phoenix' : 'phoenix', 'grabber' : 'grabber', 'ibrowse' : 'ibrowse', 'httrack' : 'httrack', 'mpg123' : 'mediaplayer', 'multizilla' : 'multizilla', 'betanews_reader' : 'rss', 'samsung' : 'pdaphone', 'camino' : 'chimera', 'chimera' : 'chimera', 'iphone' : 'pdaphone', 'galeon' : 'galeon', 'gnome\-vfs' : 'gnome', 'omniweb' : 'omniweb', 'qts' : 'mediaplayer', 'xine' : 'mediaplayer', 'wapsilon' : 'pdaphone', 'msie' : 'msie', 'encompass' : 'encompass', 'panasonic' : 'pdaphone', 'up\.' : 'pdaphone', 'pulpfiction' : 'rss', 'neon' : 'neon', 'blackberry' : 'pdaphone', 'teleport' : 'teleport', 'mot\-' : 'pdaphone', 'granparadiso' : 'firefox', 'freeamp' : 'mediaplayer', 'applesyndication' : 'rss', 'pubsub\-rss\-reader' : 'rss', 'safari' : 'safari', 'vodafone' : 'pdaphone', 'rssxpress' : 'rss', 'gregarius' : 'rss', 'minefield' : 'firefox', 'go!zilla' : 'gozilla', 'icab' : 'icab', 'flock' : 'flock', 'leechget' : 'leechget', 'syndirella' : 'rss', 'icecat' : 'icecat', 'epiphany' : 'epiphany', 'donzilla' : 'mozilla', 'philips' : 'pdaphone', 'webreaper' : 'webreaper', 'newsfire' : 'rss', 'sharpreader' : 'rss', 'strata' : 'mozilla', 'ncsa_mosaic' : 'ncsa_mosaic', 'rssreader' : 'rss', 'rssowl' : 'rss', 'potu' : 'rss', 'vienna' : 'rss', 'lg\-' : 'pdaphone', 'liferea' : 'rss', 'kazehakase' : 'mozilla', 'amigavoyager' : 'amigavoyager', 'real' : 'real', 'aweb' : 'aweb', 'cyberdog' : 'cyberdog', 'netscape' : 'netscape', 'firefox' : 'firefox', 'rss\sxpress' : 'rss'} +browsers_icons = {'bpftp' : 'bpftp', 'jetbrains_omea' : 'rss', 'blogbridge' : 'rss', 'galeon' : 'galeon', 'liferea' : 'rss', 'dillo' : 'dillo', 'microsoft\-webdav\-miniredir' : 'frontpage', 'icab' : 'icab', 'xmms' : 'mediaplayer', 'netscape' : 'netscape', 'plagger' : 'rss', 'encompass' : 'encompass', 'ericsson' : 'pdaphone', 'doris' : 'doris', 'rssxpress' : 'rss', 'netpositive' : 'netpositive', 'sage' : 'rss', 'sonyericsson' : 'pdaphone', 'newsfire' : 'rss', 'granparadiso' : 'firefox', 'httrack' : 'httrack', 'applesyndication' : 'rss', 'winamp' : 'mediaplayer', 'iphone' : 'pdaphone', 'cjb\.net' : 'cjbnet', 'samsung' : 'pdaphone', 'amigavoyager' : 'amigavoyager', 'opera' : 'opera', 'gnome\-vfs' : 'gnome', 'abilon' : 'abilon', 'amaya' : 'amaya', 'potu' : 'rss', 'philips' : 'pdaphone', 'webcopier' : 'webcopier', 'sec\-' : 'pdaphone', 'songbird' : 'mozilla', 'apt' : 'apt', 'newsgator' : 'rss', 'straw' : 'rss', 'ncsa_mosaic' : 'ncsa_mosaic', 'itunes' : 'mediaplayer', 'javaws' : 'java', 'rssbandit' : 'rss', 'chimera' : 'chimera', 'qts' : 'mediaplayer', 'real' : 'real', 'sylera' : 'mozilla', 'camino' : 'chimera', 'aweb' : 'aweb', 'feeddemon' : 'rss', 'phoenix' : 'phoenix', 'microsoft\sdata\saccess\sinternet\spublishing\sprovider\scache\smanager' : 'frontpage', 'svn' : 'subversion', 'go!zilla' : 'gozilla', 'wapsilon' : 'pdaphone', 'neon' : 'neon', 'donzilla' : 'mozilla', 'strata' : 'mozilla', 'freshdownload' : 'freshdownload', 'mot\-' : 'pdaphone', 'sie\-' : 'pdaphone', 'webreaper' : 'webreaper', 'microsoft\sdata\saccess\sinternet\spublishing\sprovider\sdav' : 'frontpage', 'flock' : 'flock', 'nsplayer' : 'netshow', 'epiphany' : 'epiphany', 'mint_audio' : 'mediaplayer', 'prism' : 'mozilla', 'multizilla' : 'multizilla', 'shrook' : 'rss', 'wizz\srss\snews\sreader' : 'wizz', 'webcollage' : 'pdaphone', 'pulpfiction' : 'rss', 'k\-meleon' : 'kmeleon', 'getright' : 'getright', 'sonique' : 'mediaplayer', 'omniweb' : 'omniweb', 'teleport' : 'teleport', 'webtv' : 'webtv', 'microsoft\soffice\sexistence\sdiscovery' : 'frontpage', 'jetaudio' : 'mediaplayer', 'lotus\-notes' : 'lotusnotes', 'bonecho' : 'firefox', 'panasonic' : 'pdaphone', 'pubsub\-rss\-reader' : 'rss', 'ecatch' : 'ecatch', 'aggrevator' : 'rss', 'mmef' : 'pdaphone', 'mplayer' : 'mediaplayer', 'dreamcast' : 'dreamcast', 'safari' : 'safari', 'audion' : 'mediaplayer', 'uplayer' : 'mediaplayer', 'webcapture' : 'adobe', 'vienna' : 'rss', 'macweb' : 'macweb', 'microsoft\soffice\sprotocol\sdiscovery' : 'frontpage', 'sagem' : 'pdaphone', 'rssowl' : 'rss', 'mspie' : 'pdaphone', 'avantbrowser' : 'avant', 'up\.' : 'pdaphone', 'wap' : 'pdaphone', 'hotjava' : 'hotjava', 'netnewswire' : 'rss', 'cyberdog' : 'cyberdog', 'gnus' : 'gnus', 'firefox' : 'firefox', 'flashget' : 'flashget', 'msie' : 'msie', 'android' : 'android', 'msfrontpageexpress' : 'fpexpress', 'ibrowse' : 'ibrowse', 'portalmmm' : 'pdaphone', 'xaudio' : 'mediaplayer', 'rssreader' : 'rss', 'seamonkey' : 'seamonkey', 'iceweasel' : 'iceweasel', 'blackberry' : 'pdaphone', 'alcatel' : 'pdaphone', 'icecat' : 'icecat', 'staroffice' : 'staroffice', 'analogx_proxy' : 'analogx', 'aiderss' : 'rss', 'lg\-' : 'pdaphone', 'newzcrawler' : 'rss', 'konqueror' : 'konqueror', 'betanews_reader' : 'rss', 'rss\sxpress' : 'rss', 'gregarius' : 'rss', 'syndirella' : 'rss', 'windows\-media\-player' : 'mplayer', 'adobeair' : 'adobe', 'firebird' : 'phoenix', 'sharpreader' : 'rss', 'feedtools' : 'rss', 'xine' : 'mediaplayer', 'pluck' : 'rss', 'xbox' : 'winxbox', 'leechget' : 'leechget', 'grabber' : 'grabber', 'iceape' : 'mozilla', 'wapalizer' : 'pdaphone', 'feedreader' : 'rss', 'nokia' : 'pdaphone', 'freeamp' : 'mediaplayer', 'chrome' : 'chrome', 'akregator' : 'rss', 'hatena_rss' : 'rss', 'webzip' : 'webzip', 'vodafone' : 'pdaphone', 'mozilla' : 'mozilla', 'minefield' : 'firefox', 'fresco' : 'fresco', 'lynx' : 'lynx', 'microsoft\sdata\saccess\sinternet\spublishing\sprovider\sprotocol\sdiscovery' : 'frontpage', 'docomo' : 'pdaphone', 'mpg123' : 'mediaplayer', 'greatnews' : 'rss', 'kazehakase' : 'mozilla'} diff --git a/conf.py b/conf.py index e06aa5b..330196b 100644 --- a/conf.py +++ b/conf.py @@ -10,8 +10,8 @@ display_visitor_ip = True # Hooks used pre_analysis_hooks = ['page_to_hit', 'robots'] -post_analysis_hooks = ['referers', 'top_pages', 'top_downloads', 'operating_systems', 'browsers', 'feeds', 'hours_stats', 'reverse_dns'] -display_hooks = ['track_users', 'top_visitors', 'all_visits', 'referers', 'top_pages', 'top_downloads', 'referers_diff', 'operating_systems', 'browsers', 'feeds', 'hours_stats', 'top_downloads_diff'] +post_analysis_hooks = ['referers', 'top_pages', 'top_downloads', 'operating_systems', 'browsers', 'feeds', 'hours_stats', 'reverse_dns', 'ip_to_geo'] +display_hooks = ['track_users', 'top_visitors', 'all_visits', 'referers', 'top_pages', 'top_downloads', 'referers_diff', 'ip_to_geo', 'operating_systems', 'browsers', 'feeds', 'hours_stats', 'top_downloads_diff'] # Reverse DNS timeout reverse_dns_timeout = 0.2 diff --git a/default_conf.py b/default_conf.py index dcc8190..c8eb791 100644 --- a/default_conf.py +++ b/default_conf.py @@ -41,7 +41,7 @@ viewed_http_codes = [200, 304] count_hit_only_visitors = True # Multimedia extensions (not accounted as downloaded files) -multimedia_files = ['png', 'jpg', 'jpeg', 'gif', 'ico', +multimedia_files = ['png', 'jpg', 'jpeg', 'gif', 'ico', 'svg', 'css', 'js'] # Default resources path (will be symlinked in DISPLAY_OUTPUT) diff --git a/display.py b/display.py index 6be75df..35dc0b3 100644 --- a/display.py +++ b/display.py @@ -48,10 +48,18 @@ class DisplayHTMLRaw(object): def _build(self, f, html): if html: f.write(html) - def build(self, f): + def build(self, f, filters=None): + if filters: self.filter(filters) self._buildHTML() self._build(f, self.html) + def _filter(self, function, **kwargs): + pass + + def filter(self, filters): + for (args, function) in filters: + self._filter(function, **args) + def getTitle(self): return '' @@ -189,6 +197,18 @@ class DisplayHTMLBlockTable(DisplayHTMLBlock): val = r[column] and int(r[column]) or 0 self.setCellValue(index, column_insertion, '%.1f%%' % (float(val*100)/float(total))) + def _filter(self, function, column, args): + target_col = None + for col in range(0, len(self.cols)): + if self.cols[col] == column: + target_col = col + break + if target_col is None: return + for row in self.rows: + res = function(row[target_col], **args) + if res: + row[target_col] = res + def _buildHTML(self): style = u'' if self.table_css: style = u' class="%s"' % (self.table_css) @@ -315,11 +335,14 @@ class DisplayHTMLPage(object): if title == b.getTitle(): return b return None - + + def getAllBlocks(self): + return self.blocks + def appendBlock(self, block): self.blocks.append(block) - def build(self, root, displayVersion=True): + def build(self, root, displayVersion=True, filters=None): filename = os.path.join(root, self.filename) base = os.path.dirname(filename) @@ -339,9 +362,9 @@ class DisplayHTMLPage(object): f.write(u'%s' % (self.title)) f.write(u'') for block in self.blocks: - block.build(f) + block.build(f, filters=filters) if displayVersion: - f.write(u'
Generated by IWLA %s
' % + f.write(u'
Generated by IWLA %s
' % ("http://indefero.soutade.fr/p/iwla", self.iwla.getVersion())) f.write(u'') f.close() @@ -349,8 +372,12 @@ class DisplayHTMLPage(object): class DisplayHTMLBuild(object): def __init__(self, iwla): - self.pages = [] self.iwla = iwla + self.filters = [] + self.clear() + + def clear(self): + self.pages = [] def createPage(self, *args): return DisplayHTMLPage(self.iwla, *args) @@ -364,6 +391,9 @@ class DisplayHTMLBuild(object): return page return None + def getAllPages(self): + return self.pages + def addPage(self, page): self.pages.append(page) @@ -378,7 +408,11 @@ class DisplayHTMLBuild(object): os.symlink(target, link_name) for page in self.pages: - page.build(root) + page.build(root, filters=self.filters) + + def addColumnFilter(self, column, function, args): + self.filters.append(({'column':column, 'args':args}, function)) + # # Global functions @@ -417,4 +451,3 @@ def createCurTitle(iwla, title): if domain_name: title += u' - %s' % (domain_name) return title - diff --git a/docs/index.md b/docs/index.md index 0415eea..2d5ab68 100644 --- a/docs/index.md +++ b/docs/index.md @@ -103,12 +103,13 @@ Optional configuration values ends with *. * plugins/display/browsers.py * plugins/display/feeds.py * plugins/display/hours_stats.py + * plugins/display/ip_to_geo.py * plugins/display/istats_diff.py * plugins/display/operating_systems.py - * plugins/display/referers.py * plugins/display/referers_diff.py - * plugins/display/top_downloads.py + * plugins/display/referers.py * plugins/display/top_downloads_diff.py + * plugins/display/top_downloads.py * plugins/display/top_hits.py * plugins/display/top_pages.py * plugins/display/top_visitors.py @@ -116,6 +117,8 @@ Optional configuration values ends with *. * plugins/post_analysis/browsers.py * plugins/post_analysis/feeds.py * plugins/post_analysis/hours_stats.py + * plugins/post_analysis/ip_to_geo.py + * plugins/post_analysis/iptogeo.py * plugins/post_analysis/operating_systems.py * plugins/post_analysis/referers.py * plugins/post_analysis/reverse_dns.py @@ -323,6 +326,32 @@ plugins.display.hours_stats None +plugins.display.ip_to_geo +------------------------- + + Display hook + + Add geo statistics + + Plugin requirements : + post_analysis/ip_to_geo + + Conf values needed : + create_geo_page* + + Output files : + OUTPUT_ROOT/year/month/index.html + + Statistics creation : + None + + Statistics update : + None + + Statistics deletion : + None + + plugins.display.istats_diff --------------------------- @@ -375,6 +404,32 @@ plugins.display.operating_systems None +plugins.display.referers_diff +----------------------------- + + Display hook + + Enlight new and updated key phrases in in all_key_phrases.html + + Plugin requirements : + display/referers + + Conf values needed : + None + + Output files : + None + + Statistics creation : + None + + Statistics update : + None + + Statistics deletion : + None + + plugins.display.referers ------------------------ @@ -406,15 +461,15 @@ plugins.display.referers None -plugins.display.referers_diff ------------------------------ +plugins.display.top_downloads_diff +---------------------------------- Display hook - Enlight new and updated key phrases in in all_key_phrases.html + Enlight new and updated downloads in in top_downloads.html Plugin requirements : - display/referers + display/top_downloads Conf values needed : None @@ -460,32 +515,6 @@ plugins.display.top_downloads None -plugins.display.top_downloads_diff ----------------------------------- - - Display hook - - Enlight new and updated downloads in in top_downloads.html - - Plugin requirements : - display/top_downloads - - Conf values needed : - None - - Output files : - None - - Statistics creation : - None - - Statistics update : - None - - Statistics deletion : - None - - plugins.display.top_hits ------------------------ @@ -695,6 +724,41 @@ plugins.post_analysis.hours_stats None +plugins.post_analysis.ip_to_geo +------------------------------- + + Post analysis hook + + Get country code from IP address + + Plugin requirements : + None + + Conf values needed : + iptogeo_remote_addr* + iptogeo_remote_port* + + Output files : + None + + Statistics creation : + geo => + country_code => count + None + + Statistics update : + valid_visitors: + country_code + + Statistics deletion : + None + + +plugins.post_analysis.iptogeo +----------------------------- + + + plugins.post_analysis.operating_systems --------------------------------------- diff --git a/docs/modules.md b/docs/modules.md index b68c706..0a8f2f1 100644 --- a/docs/modules.md +++ b/docs/modules.md @@ -3,12 +3,13 @@ * plugins/display/browsers.py * plugins/display/feeds.py * plugins/display/hours_stats.py + * plugins/display/ip_to_geo.py * plugins/display/istats_diff.py * plugins/display/operating_systems.py - * plugins/display/referers.py * plugins/display/referers_diff.py - * plugins/display/top_downloads.py + * plugins/display/referers.py * plugins/display/top_downloads_diff.py + * plugins/display/top_downloads.py * plugins/display/top_hits.py * plugins/display/top_pages.py * plugins/display/top_visitors.py @@ -16,6 +17,8 @@ * plugins/post_analysis/browsers.py * plugins/post_analysis/feeds.py * plugins/post_analysis/hours_stats.py + * plugins/post_analysis/ip_to_geo.py + * plugins/post_analysis/iptogeo.py * plugins/post_analysis/operating_systems.py * plugins/post_analysis/referers.py * plugins/post_analysis/reverse_dns.py @@ -223,6 +226,32 @@ plugins.display.hours_stats None +plugins.display.ip_to_geo +------------------------- + + Display hook + + Add geo statistics + + Plugin requirements : + post_analysis/ip_to_geo + + Conf values needed : + create_geo_page* + + Output files : + OUTPUT_ROOT/year/month/index.html + + Statistics creation : + None + + Statistics update : + None + + Statistics deletion : + None + + plugins.display.istats_diff --------------------------- @@ -275,6 +304,32 @@ plugins.display.operating_systems None +plugins.display.referers_diff +----------------------------- + + Display hook + + Enlight new and updated key phrases in in all_key_phrases.html + + Plugin requirements : + display/referers + + Conf values needed : + None + + Output files : + None + + Statistics creation : + None + + Statistics update : + None + + Statistics deletion : + None + + plugins.display.referers ------------------------ @@ -306,15 +361,15 @@ plugins.display.referers None -plugins.display.referers_diff ------------------------------ +plugins.display.top_downloads_diff +---------------------------------- Display hook - Enlight new and updated key phrases in in all_key_phrases.html + Enlight new and updated downloads in in top_downloads.html Plugin requirements : - display/referers + display/top_downloads Conf values needed : None @@ -360,32 +415,6 @@ plugins.display.top_downloads None -plugins.display.top_downloads_diff ----------------------------------- - - Display hook - - Enlight new and updated downloads in in top_downloads.html - - Plugin requirements : - display/top_downloads - - Conf values needed : - None - - Output files : - None - - Statistics creation : - None - - Statistics update : - None - - Statistics deletion : - None - - plugins.display.top_hits ------------------------ @@ -595,6 +624,41 @@ plugins.post_analysis.hours_stats None +plugins.post_analysis.ip_to_geo +------------------------------- + + Post analysis hook + + Get country code from IP address + + Plugin requirements : + None + + Conf values needed : + iptogeo_remote_addr* + iptogeo_remote_port* + + Output files : + None + + Statistics creation : + geo => + country_code => count + None + + Statistics update : + valid_visitors: + country_code + + Statistics deletion : + None + + +plugins.post_analysis.iptogeo +----------------------------- + + + plugins.post_analysis.operating_systems --------------------------------------- diff --git a/iwla.pot b/iwla.pot index 478a75a..22328b1 100644 --- a/iwla.pot +++ b/iwla.pot @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"POT-Creation-Date: 2015-03-02 19:44+CET\n" +"POT-Creation-Date: 2016-04-12 08:34+CEST\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -35,11 +35,11 @@ msgstr "" msgid "March" msgstr "" -#: display.py:32 iwla.py:440 +#: display.py:32 iwla.py:472 msgid "June" msgstr "" -#: display.py:32 iwla.py:440 +#: display.py:32 iwla.py:472 msgid "May" msgstr "" @@ -63,143 +63,146 @@ msgstr "" msgid "September" msgstr "" -#: display.py:187 +#: display.py:195 msgid "Ratio" msgstr "" -#: iwla.py:381 +#: iwla.py:413 msgid "Statistics" msgstr "" -#: iwla.py:389 iwla.py:442 +#: iwla.py:421 iwla.py:474 msgid "Not viewed Bandwidth" msgstr "" -#: iwla.py:389 iwla.py:442 +#: iwla.py:421 iwla.py:474 msgid "Visits" msgstr "" -#: iwla.py:389 iwla.py:442 plugins/display/all_visits.py:70 -#: plugins/display/feeds.py:75 plugins/display/hours_stats.py:73 +#: iwla.py:421 iwla.py:474 plugins/display/all_visits.py:70 +#: plugins/display/feeds.py:76 plugins/display/hours_stats.py:73 #: plugins/display/hours_stats.py:83 plugins/display/referers.py:95 #: plugins/display/referers.py:153 plugins/display/top_downloads.py:97 #: plugins/display/top_visitors.py:72 plugins/display/track_users.py:113 msgid "Hits" msgstr "" -#: iwla.py:389 iwla.py:442 plugins/display/all_visits.py:70 -#: plugins/display/feeds.py:75 plugins/display/hours_stats.py:73 +#: iwla.py:421 iwla.py:474 plugins/display/all_visits.py:70 +#: plugins/display/feeds.py:76 plugins/display/hours_stats.py:73 #: plugins/display/hours_stats.py:83 plugins/display/referers.py:95 #: plugins/display/referers.py:153 plugins/display/top_visitors.py:72 #: plugins/display/track_users.py:77 plugins/display/track_users.py:113 msgid "Pages" msgstr "" -#: iwla.py:389 iwla.py:442 plugins/display/all_visits.py:70 +#: iwla.py:421 iwla.py:474 plugins/display/all_visits.py:70 #: plugins/display/hours_stats.py:73 plugins/display/hours_stats.py:83 #: plugins/display/top_visitors.py:72 msgid "Bandwidth" msgstr "" -#: iwla.py:389 plugins/display/hours_stats.py:71 +#: iwla.py:421 plugins/display/hours_stats.py:71 msgid "By day" msgstr "" -#: iwla.py:389 plugins/display/hours_stats.py:73 +#: iwla.py:421 plugins/display/hours_stats.py:73 msgid "Day" msgstr "" -#: iwla.py:426 +#: iwla.py:458 msgid "Average" msgstr "" -#: iwla.py:431 iwla.py:476 +#: iwla.py:463 iwla.py:508 msgid "Total" msgstr "" -#: iwla.py:440 +#: iwla.py:472 msgid "Apr" msgstr "" -#: iwla.py:440 +#: iwla.py:472 msgid "Aug" msgstr "" -#: iwla.py:440 +#: iwla.py:472 msgid "Dec" msgstr "" -#: iwla.py:440 +#: iwla.py:472 msgid "Feb" msgstr "" -#: iwla.py:440 +#: iwla.py:472 msgid "Jan" msgstr "" -#: iwla.py:440 +#: iwla.py:472 msgid "Jul" msgstr "" -#: iwla.py:440 +#: iwla.py:472 msgid "Mar" msgstr "" -#: iwla.py:440 +#: iwla.py:472 msgid "Nov" msgstr "" -#: iwla.py:440 +#: iwla.py:472 msgid "Oct" msgstr "" -#: iwla.py:440 +#: iwla.py:472 msgid "Sep" msgstr "" -#: iwla.py:441 +#: iwla.py:473 msgid "Summary" msgstr "" -#: iwla.py:442 +#: iwla.py:474 msgid "Month" msgstr "" -#: iwla.py:442 -msgid "Visitors" -msgstr "" - -#: iwla.py:442 iwla.py:454 plugins/display/feeds.py:98 -#: plugins/display/operating_systems.py:90 plugins/display/track_users.py:108 +#: iwla.py:474 iwla.py:486 plugins/display/feeds.py:99 +#: plugins/display/ip_to_geo.py:109 plugins/display/operating_systems.py:90 +#: plugins/display/track_users.py:108 msgid "Details" msgstr "" -#: iwla.py:490 +#: iwla.py:474 plugins/display/ip_to_geo.py:96 +#: plugins/display/ip_to_geo.py:114 +msgid "Visitors" +msgstr "" + +#: iwla.py:522 msgid "Statistics for" msgstr "" -#: iwla.py:497 +#: iwla.py:529 msgid "Last update" msgstr "" -#: iwla.py:501 +#: iwla.py:533 msgid "Time analysis" msgstr "" -#: iwla.py:503 +#: iwla.py:535 msgid "hours" msgstr "" -#: iwla.py:504 +#: iwla.py:536 msgid "minutes" msgstr "" -#: iwla.py:504 +#: iwla.py:536 msgid "seconds" msgstr "" -#: plugins/display/all_visits.py:70 plugins/display/feeds.py:75 -#: plugins/display/top_visitors.py:72 +#: plugins/display/all_visits.py:70 plugins/display/feeds.py:76 +#: plugins/display/ip_to_geo.py:64 plugins/display/top_visitors.py:72 +#: plugins/display/track_users.py:113 msgid "Host" msgstr "" @@ -242,27 +245,35 @@ msgstr "" msgid "Others" msgstr "" +#: plugins/display/browsers.py:105 +msgid "Top Browsers" +msgstr "" + #: plugins/display/browsers.py:107 msgid "All Browsers" msgstr "" -#: plugins/display/feeds.py:69 +#: plugins/display/browsers.py:123 +msgid "Unknown" +msgstr "" + +#: plugins/display/feeds.py:70 msgid "All Feeds parsers" msgstr "" -#: plugins/display/feeds.py:75 +#: plugins/display/feeds.py:76 msgid "All feeds parsers" msgstr "" -#: plugins/display/feeds.py:91 +#: plugins/display/feeds.py:92 msgid "Merged feeds parsers" msgstr "" -#: plugins/display/feeds.py:96 +#: plugins/display/feeds.py:97 msgid "Feeds parsers" msgstr "" -#: plugins/display/feeds.py:103 +#: plugins/display/feeds.py:104 msgid "Found" msgstr "" @@ -302,6 +313,15 @@ msgstr "" msgid "Hours" msgstr "" +#: plugins/display/ip_to_geo.py:96 +msgid "Country" +msgstr "" + +#: plugins/display/ip_to_geo.py:96 plugins/display/ip_to_geo.py:107 +#: plugins/display/ip_to_geo.py:114 +msgid "Countries" +msgstr "" + #: plugins/display/operating_systems.py:78 #: plugins/display/operating_systems.py:88 msgid "Operating Systems" @@ -344,10 +364,6 @@ msgstr "" msgid "All Key Phrases" msgstr "" -#: plugins/display/referers.py:200 -msgid "Key phrases" -msgstr "" - #: plugins/display/referers.py:200 plugins/display/referers.py:216 msgid "Key phrase" msgstr "" @@ -356,6 +372,10 @@ msgstr "" msgid "Search" msgstr "" +#: plugins/display/referers.py:200 plugins/display/referers_diff.py:56 +msgid "Key phrases" +msgstr "" + #: plugins/display/referers.py:210 msgid "Top key phrases" msgstr "" @@ -369,6 +389,7 @@ msgid "Hit" msgstr "" #: plugins/display/top_downloads.py:71 plugins/display/top_downloads.py:91 +#: plugins/display/top_downloads_diff.py:56 msgid "All Downloads" msgstr "" @@ -402,7 +423,3 @@ msgstr "" msgid "Last Access" msgstr "" -#: plugins/display/track_users.py:113 -msgid "IP" -msgstr "" - diff --git a/iwla.py b/iwla.py index 57e38f3..6478720 100755 --- a/iwla.py +++ b/iwla.py @@ -131,7 +131,7 @@ class IWLA(object): ANALYSIS_CLASS = 'HTTP' API_VERSION = 1 - IWLA_VERSION = '0.2' + IWLA_VERSION = '0.3' def __init__(self, logLevel): self.meta_infos = {} @@ -148,6 +148,7 @@ class IWLA(object): self.log_re = re.compile(self.log_format_extracted) self.uri_re = re.compile(r'(?P[^\?#]+)(\?(?P[^#]+))?(#.*)?') self.domain_name_re = re.compile(r'.*%s' % conf.domain_name) + self.final_slashes_re = re.compile(r'/+$') self.plugins = [(conf.PRE_HOOK_DIRECTORY , conf.pre_analysis_hooks), (conf.POST_HOOK_DIRECTORY , conf.post_analysis_hooks), (conf.DISPLAY_HOOK_DIRECTORY , conf.display_hooks)] @@ -187,7 +188,7 @@ class IWLA(object): def getMonthStats(self): return self.current_analysis['month_stats'] - def getCurrentVisists(self): + def getCurrentVisits(self): return self.current_analysis['visits'] def getValidVisitors(self): @@ -229,7 +230,7 @@ class IWLA(object): return self.meta_infos def _clearDisplay(self): - self.display = DisplayHTMLBuild(self) + self.display.clear() return self.display def getDBFilename(self, time): @@ -288,6 +289,13 @@ class IWLA(object): self.logger.debug("False") return False + def isValidVisitor(self, hit): + if hit['robot']: return False + if not (conf.count_hit_only_visitors or\ + hit['viewed_pages']): + return False + return True + def _appendHit(self, hit): remote_addr = hit['remote_addr'] @@ -334,6 +342,20 @@ class IWLA(object): super_hit['robot'] = False super_hit['hit_only'] = 0 + def _normalizeURI(self, uri): + if uri == '/': return uri + uri = self.final_slashes_re.sub('/', uri) + return uri + + def _removeFinalSlashes(self, uri): + if uri == '/': return uri + return self.final_slashes_re.sub('', uri) + + def _normalizeParameters(self, parameters): + # No parameters + if parameters == '?': return None + return parameters + def _decodeHTTPRequest(self, hit): if not 'request' in hit.keys(): return False @@ -344,9 +366,11 @@ class IWLA(object): uri_groups = self.uri_re.match(hit['extract_request']['http_uri']) if uri_groups: d = uri_groups.groupdict() - hit['extract_request']['extract_uri'] = d['extract_uri'] + hit['extract_request']['extract_uri'] = self._normalizeURI(d['extract_uri']) if 'extract_parameters' in d.keys(): - hit['extract_request']['extract_parameters'] = d['extract_parameters'] + parameters = self._normalizeParameters(d['extract_parameters']) + if parameters: + hit['extract_request']['extract_parameters'] = parameters else: self.logger.warning("Bad request extraction %s" % (hit['request'])) return False @@ -355,6 +379,8 @@ class IWLA(object): referer_groups = self.uri_re.match(hit['http_referer']) if referer_groups: hit['extract_referer'] = referer_groups.groupdict() + hit['extract_referer']['extract_uri'] = self._removeFinalSlashes(hit['extract_referer']['extract_uri']) + hit['extract_referer']['extract_parameters'] = self._normalizeParameters(hit['extract_referer']['extract_parameters']) return True def _decodeTime(self, hit): @@ -577,11 +603,8 @@ class IWLA(object): self.valid_visitors = {} for (k,v) in visits.items(): - if v['robot']: continue - if not (conf.count_hit_only_visitors or\ - v['viewed_pages']): - continue - self.valid_visitors[k] = v + if self.isValidVisitor(v): + self.valid_visitors[k] = v duplicated_stats['nb_visitors'] = stats['nb_visitors'] = len(self.valid_visitors.keys()) @@ -619,7 +642,7 @@ class IWLA(object): for (k, super_hit) in visits.items(): if super_hit['last_access'].tm_mday != cur_time.tm_mday: continue - viewed_page = False + viewed_pages = False for hit in super_hit['requests'][::-1]: if hit['time_decoded'].tm_mday != cur_time.tm_mday: break @@ -804,7 +827,7 @@ if __name__ == '__main__': default='INFO', type=str, help='Loglevel in %s, default : %s' % (['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'], 'INFO')) - parser.add_argument('-r', '--reset', dest='reset', action='store_true', + parser.add_argument('-r', '--reset', dest='reset', default=False, help='Reset analysis to a specific date (month/year)') diff --git a/locales/fr_FR/LC_MESSAGES/iwla.mo b/locales/fr_FR/LC_MESSAGES/iwla.mo index a37799c..8fe7195 100644 Binary files a/locales/fr_FR/LC_MESSAGES/iwla.mo and b/locales/fr_FR/LC_MESSAGES/iwla.mo differ diff --git a/locales/fr_FR/LC_MESSAGES/iwla.pot b/locales/fr_FR/LC_MESSAGES/iwla.pot index 09e7e94..4239d1d 100644 --- a/locales/fr_FR/LC_MESSAGES/iwla.pot +++ b/locales/fr_FR/LC_MESSAGES/iwla.pot @@ -5,8 +5,8 @@ msgid "" msgstr "" "Project-Id-Version: iwla\n" -"POT-Creation-Date: 2015-03-02 19:44+CET\n" -"PO-Revision-Date: 2015-03-02 19:45+0100\n" +"POT-Creation-Date: 2016-04-12 08:34+CEST\n" +"PO-Revision-Date: 2016-04-12 08:39+0100\n" "Last-Translator: Soutadé \n" "Language-Team: iwla\n" "Language: fr_FR\n" @@ -37,11 +37,13 @@ msgstr "Juillet" msgid "March" msgstr "Mars" -#: display.py:32 iwla.py:440 +#: display.py:32 +#: iwla.py:472 msgid "June" msgstr "Juin" -#: display.py:32 iwla.py:440 +#: display.py:32 +#: iwla.py:472 msgid "May" msgstr "Mai" @@ -65,147 +67,177 @@ msgstr "Octobre" msgid "September" msgstr "Septembre" -#: display.py:187 +#: display.py:195 msgid "Ratio" msgstr "Pourcentage" -#: iwla.py:381 +#: iwla.py:413 msgid "Statistics" msgstr "Statistiques" -#: iwla.py:389 iwla.py:442 +#: iwla.py:421 +#: iwla.py:474 msgid "Not viewed Bandwidth" msgstr "Traffic non vu" -#: iwla.py:389 iwla.py:442 +#: iwla.py:421 +#: iwla.py:474 msgid "Visits" msgstr "Visites" -#: iwla.py:389 iwla.py:442 plugins/display/all_visits.py:70 -#: plugins/display/feeds.py:75 plugins/display/hours_stats.py:73 -#: plugins/display/hours_stats.py:83 plugins/display/referers.py:95 -#: plugins/display/referers.py:153 plugins/display/top_downloads.py:97 -#: plugins/display/top_visitors.py:72 plugins/display/track_users.py:113 +#: iwla.py:421 +#: iwla.py:474 +#: plugins/display/all_visits.py:70 +#: plugins/display/feeds.py:76 +#: plugins/display/hours_stats.py:73 +#: plugins/display/hours_stats.py:83 +#: plugins/display/referers.py:95 +#: plugins/display/referers.py:153 +#: plugins/display/top_downloads.py:97 +#: plugins/display/top_visitors.py:72 +#: plugins/display/track_users.py:113 msgid "Hits" msgstr "Hits" -#: iwla.py:389 iwla.py:442 plugins/display/all_visits.py:70 -#: plugins/display/feeds.py:75 plugins/display/hours_stats.py:73 -#: plugins/display/hours_stats.py:83 plugins/display/referers.py:95 -#: plugins/display/referers.py:153 plugins/display/top_visitors.py:72 -#: plugins/display/track_users.py:77 plugins/display/track_users.py:113 +#: iwla.py:421 +#: iwla.py:474 +#: plugins/display/all_visits.py:70 +#: plugins/display/feeds.py:76 +#: plugins/display/hours_stats.py:73 +#: plugins/display/hours_stats.py:83 +#: plugins/display/referers.py:95 +#: plugins/display/referers.py:153 +#: plugins/display/top_visitors.py:72 +#: plugins/display/track_users.py:77 +#: plugins/display/track_users.py:113 msgid "Pages" msgstr "Pages" -#: iwla.py:389 iwla.py:442 plugins/display/all_visits.py:70 -#: plugins/display/hours_stats.py:73 plugins/display/hours_stats.py:83 +#: iwla.py:421 +#: iwla.py:474 +#: plugins/display/all_visits.py:70 +#: plugins/display/hours_stats.py:73 +#: plugins/display/hours_stats.py:83 #: plugins/display/top_visitors.py:72 msgid "Bandwidth" msgstr "Bande passante" -#: iwla.py:389 plugins/display/hours_stats.py:71 +#: iwla.py:421 +#: plugins/display/hours_stats.py:71 msgid "By day" msgstr "Par jour" -#: iwla.py:389 plugins/display/hours_stats.py:73 +#: iwla.py:421 +#: plugins/display/hours_stats.py:73 msgid "Day" msgstr "Jour" -#: iwla.py:426 +#: iwla.py:458 msgid "Average" msgstr "Moyenne" -#: iwla.py:431 iwla.py:476 +#: iwla.py:463 +#: iwla.py:508 msgid "Total" msgstr "Total" -#: iwla.py:440 +#: iwla.py:472 msgid "Apr" msgstr "Avr" -#: iwla.py:440 +#: iwla.py:472 msgid "Aug" msgstr "Août" -#: iwla.py:440 +#: iwla.py:472 msgid "Dec" msgstr "Déc" -#: iwla.py:440 +#: iwla.py:472 msgid "Feb" msgstr "Fév" -#: iwla.py:440 +#: iwla.py:472 msgid "Jan" msgstr "Jan" -#: iwla.py:440 +#: iwla.py:472 msgid "Jul" msgstr "Jui" -#: iwla.py:440 +#: iwla.py:472 msgid "Mar" msgstr "Mars" -#: iwla.py:440 +#: iwla.py:472 msgid "Nov" msgstr "Nov" -#: iwla.py:440 +#: iwla.py:472 msgid "Oct" msgstr "Oct" -#: iwla.py:440 +#: iwla.py:472 msgid "Sep" msgstr "Sep" -#: iwla.py:441 +#: iwla.py:473 msgid "Summary" msgstr "Résumé" -#: iwla.py:442 +#: iwla.py:474 msgid "Month" msgstr "Mois" -#: iwla.py:442 -msgid "Visitors" -msgstr "Visiteurs" - -#: iwla.py:442 iwla.py:454 plugins/display/feeds.py:98 -#: plugins/display/operating_systems.py:90 plugins/display/track_users.py:108 +#: iwla.py:474 +#: iwla.py:486 +#: plugins/display/feeds.py:99 +#: plugins/display/ip_to_geo.py:109 +#: plugins/display/operating_systems.py:90 +#: plugins/display/track_users.py:108 msgid "Details" msgstr "Détails" -#: iwla.py:490 +#: iwla.py:474 +#: plugins/display/ip_to_geo.py:96 +#: plugins/display/ip_to_geo.py:114 +msgid "Visitors" +msgstr "Visiteurs" + +#: iwla.py:522 msgid "Statistics for" msgstr "Statistiques pour" -#: iwla.py:497 +#: iwla.py:529 msgid "Last update" msgstr "Dernière mise à jour" -#: iwla.py:501 +#: iwla.py:533 msgid "Time analysis" msgstr "Durée de l'analyse" -#: iwla.py:503 +#: iwla.py:535 msgid "hours" msgstr "heures " -#: iwla.py:504 +#: iwla.py:536 msgid "minutes" msgstr "minutes" -#: iwla.py:504 +#: iwla.py:536 msgid "seconds" msgstr "secondes" -#: plugins/display/all_visits.py:70 plugins/display/feeds.py:75 +#: plugins/display/all_visits.py:70 +#: plugins/display/feeds.py:76 +#: plugins/display/ip_to_geo.py:64 #: plugins/display/top_visitors.py:72 +#: plugins/display/track_users.py:113 msgid "Host" msgstr "Hôte" -#: plugins/display/all_visits.py:70 plugins/display/top_visitors.py:72 +#: plugins/display/all_visits.py:70 +#: plugins/display/top_visitors.py:72 msgid "Last seen" msgstr "Dernière visite" @@ -213,7 +245,8 @@ msgstr "Dernière visite" msgid "All visits" msgstr "Toutes les visites" -#: plugins/display/all_visits.py:93 plugins/display/top_visitors.py:72 +#: plugins/display/all_visits.py:93 +#: plugins/display/top_visitors.py:72 msgid "Top visitors" msgstr "Top visiteurs" @@ -221,50 +254,70 @@ msgstr "Top visiteurs" msgid "Browsers" msgstr "Navigateurs" -#: plugins/display/browsers.py:79 plugins/display/browsers.py:113 +#: plugins/display/browsers.py:79 +#: plugins/display/browsers.py:113 msgid "Browser" msgstr "Navigateur" -#: plugins/display/browsers.py:79 plugins/display/browsers.py:113 +#: plugins/display/browsers.py:79 +#: plugins/display/browsers.py:113 #: plugins/display/operating_systems.py:78 -#: plugins/display/operating_systems.py:95 plugins/display/top_hits.py:71 -#: plugins/display/top_hits.py:97 plugins/display/top_pages.py:71 +#: plugins/display/operating_systems.py:95 +#: plugins/display/top_hits.py:71 +#: plugins/display/top_hits.py:97 +#: plugins/display/top_pages.py:71 #: plugins/display/top_pages.py:96 msgid "Entrance" msgstr "Entrées" -#: plugins/display/browsers.py:98 plugins/display/browsers.py:128 -#: plugins/display/referers.py:110 plugins/display/referers.py:125 -#: plugins/display/referers.py:140 plugins/display/referers.py:163 -#: plugins/display/referers.py:174 plugins/display/referers.py:185 -#: plugins/display/referers.py:222 plugins/display/top_downloads.py:83 -#: plugins/display/top_downloads.py:103 plugins/display/top_hits.py:82 -#: plugins/display/top_hits.py:103 plugins/display/top_pages.py:82 -#: plugins/display/top_pages.py:102 plugins/display/top_visitors.py:92 +#: plugins/display/browsers.py:98 +#: plugins/display/browsers.py:128 +#: plugins/display/referers.py:110 +#: plugins/display/referers.py:125 +#: plugins/display/referers.py:140 +#: plugins/display/referers.py:163 +#: plugins/display/referers.py:174 +#: plugins/display/referers.py:185 +#: plugins/display/referers.py:222 +#: plugins/display/top_downloads.py:83 +#: plugins/display/top_downloads.py:103 +#: plugins/display/top_hits.py:82 +#: plugins/display/top_hits.py:103 +#: plugins/display/top_pages.py:82 +#: plugins/display/top_pages.py:102 +#: plugins/display/top_visitors.py:92 msgid "Others" msgstr "Autres" +#: plugins/display/browsers.py:105 +msgid "Top Browsers" +msgstr "Top Navigateurs" + #: plugins/display/browsers.py:107 msgid "All Browsers" msgstr "Tous les navigateurs" -#: plugins/display/feeds.py:69 +#: plugins/display/browsers.py:123 +msgid "Unknown" +msgstr "Inconnu" + +#: plugins/display/feeds.py:70 msgid "All Feeds parsers" msgstr "Tous les agrégateurs" -#: plugins/display/feeds.py:75 +#: plugins/display/feeds.py:76 msgid "All feeds parsers" msgstr "Tous les agrégateurs" -#: plugins/display/feeds.py:91 +#: plugins/display/feeds.py:92 msgid "Merged feeds parsers" msgstr "Agrégateurs fusionnés" -#: plugins/display/feeds.py:96 +#: plugins/display/feeds.py:97 msgid "Feeds parsers" msgstr "Agrégateurs" -#: plugins/display/feeds.py:103 +#: plugins/display/feeds.py:104 msgid "Found" msgstr "Trouvé" @@ -304,6 +357,16 @@ msgstr "Par heures" msgid "Hours" msgstr "Heures" +#: plugins/display/ip_to_geo.py:96 +msgid "Country" +msgstr "Pays" + +#: plugins/display/ip_to_geo.py:96 +#: plugins/display/ip_to_geo.py:107 +#: plugins/display/ip_to_geo.py:114 +msgid "Countries" +msgstr "Pays" + #: plugins/display/operating_systems.py:78 #: plugins/display/operating_systems.py:88 msgid "Operating Systems" @@ -318,19 +381,23 @@ msgstr "Système d'exploitation" msgid "Connexion from" msgstr "Connexion depuis" -#: plugins/display/referers.py:95 plugins/display/referers.py:153 +#: plugins/display/referers.py:95 +#: plugins/display/referers.py:153 msgid "Origin" msgstr "Origine" -#: plugins/display/referers.py:99 plugins/display/referers.py:156 +#: plugins/display/referers.py:99 +#: plugins/display/referers.py:156 msgid "Search Engine" msgstr "Moteur de recherche" -#: plugins/display/referers.py:114 plugins/display/referers.py:167 +#: plugins/display/referers.py:114 +#: plugins/display/referers.py:167 msgid "External URL" msgstr "URL externe" -#: plugins/display/referers.py:129 plugins/display/referers.py:178 +#: plugins/display/referers.py:129 +#: plugins/display/referers.py:178 msgid "External URL (robot)" msgstr "URL externe (robot)" @@ -347,17 +414,20 @@ msgid "All Key Phrases" msgstr "Toutes les phrases clé" #: plugins/display/referers.py:200 -msgid "Key phrases" -msgstr "Phrases clé" - -#: plugins/display/referers.py:200 plugins/display/referers.py:216 +#: plugins/display/referers.py:216 msgid "Key phrase" msgstr "Phrase clé" -#: plugins/display/referers.py:200 plugins/display/referers.py:216 +#: plugins/display/referers.py:200 +#: plugins/display/referers.py:216 msgid "Search" msgstr "Recherche" +#: plugins/display/referers.py:200 +#: plugins/display/referers_diff.py:56 +msgid "Key phrases" +msgstr "Phrases clé" + #: plugins/display/referers.py:210 msgid "Top key phrases" msgstr "Top phrases clé" @@ -370,13 +440,18 @@ msgstr "Toutes les phrases clé" msgid "Hit" msgstr "Hit" -#: plugins/display/top_downloads.py:71 plugins/display/top_downloads.py:91 +#: plugins/display/top_downloads.py:71 +#: plugins/display/top_downloads.py:91 +#: plugins/display/top_downloads_diff.py:56 msgid "All Downloads" msgstr "Tous les téléchargements" -#: plugins/display/top_downloads.py:71 plugins/display/top_downloads.py:97 -#: plugins/display/top_hits.py:71 plugins/display/top_hits.py:97 -#: plugins/display/top_pages.py:71 plugins/display/top_pages.py:96 +#: plugins/display/top_downloads.py:71 +#: plugins/display/top_downloads.py:97 +#: plugins/display/top_hits.py:71 +#: plugins/display/top_hits.py:97 +#: plugins/display/top_pages.py:71 +#: plugins/display/top_pages.py:96 msgid "URI" msgstr "URI" @@ -384,11 +459,13 @@ msgstr "URI" msgid "Top Downloads" msgstr "Top Téléchargements" -#: plugins/display/top_hits.py:71 plugins/display/top_hits.py:91 +#: plugins/display/top_hits.py:71 +#: plugins/display/top_hits.py:91 msgid "All Hits" msgstr "Tous les hits" -#: plugins/display/top_pages.py:71 plugins/display/top_pages.py:90 +#: plugins/display/top_pages.py:71 +#: plugins/display/top_pages.py:90 msgid "All Pages" msgstr "Toutes les pages" @@ -396,17 +473,18 @@ msgstr "Toutes les pages" msgid "Top Pages" msgstr "Top Pages" -#: plugins/display/track_users.py:77 plugins/display/track_users.py:106 +#: plugins/display/track_users.py:77 +#: plugins/display/track_users.py:106 msgid "Tracked users" msgstr "Utilisateurs traqués" -#: plugins/display/track_users.py:77 plugins/display/track_users.py:113 +#: plugins/display/track_users.py:77 +#: plugins/display/track_users.py:113 msgid "Last Access" msgstr "Dernière visite" -#: plugins/display/track_users.py:113 -msgid "IP" -msgstr "IP" +#~ msgid "IP" +#~ msgstr "IP" #~ msgid "Page" #~ msgstr "Page" diff --git a/plugins/display/browsers.py b/plugins/display/browsers.py index 3d1202d..9052162 100644 --- a/plugins/display/browsers.py +++ b/plugins/display/browsers.py @@ -83,11 +83,12 @@ class IWLADisplayBrowsers(IPlugin): for (browser, entrance) in new_list: if browser != 'unknown': try: - icon = '' % (self.icon_path, awstats_data.browsers_icons[self.icon_names[browser]]) + name = awstats_data.browsers_icons[self.icon_names[browser]] + icon = '%s icon' % (name, self.icon_path, name) except: - icon = '' % (self.icon_path) + icon = 'Unknown browser icon' % (self.icon_path) else: - icon = '' % (self.icon_path) + icon = 'Unknown browser icon' % (self.icon_path) browser = 'Unknown' table.appendRow([icon, browser, entrance]) total_browsers[2] += entrance @@ -115,11 +116,12 @@ class IWLADisplayBrowsers(IPlugin): for (browser, entrance) in browsers[:10]: if browser != 'unknown': try: - icon = '' % (self.icon_path, awstats_data.browsers_icons[self.icon_names[browser]]) + name = awstats_data.browsers_icons[self.icon_names[browser]] + icon = '%s icon' % (name, self.icon_path, name) except: - icon = '' % (self.icon_path) + icon = 'Unknown browser icon' % (self.icon_path) else: - icon = '' % (self.icon_path) + icon = 'Unknown browser icon' % (self.icon_path) browser = self.iwla._(u'Unknown') table.appendRow([icon, browser, entrance]) total_browsers[2] -= entrance diff --git a/plugins/display/feeds.py b/plugins/display/feeds.py index bcd7194..ca5de4e 100644 --- a/plugins/display/feeds.py +++ b/plugins/display/feeds.py @@ -62,7 +62,7 @@ class IWLADisplayFeeds(IPlugin): from plugins.post_analysis.feeds import IWLAPostAnalysisFeeds display = self.iwla.getDisplay() - hits = self.iwla.getCurrentVisists() + hits = self.iwla.getCurrentVisits() nb_feeds_parsers = 0 # All in a page diff --git a/plugins/display/ip_to_geo.py b/plugins/display/ip_to_geo.py new file mode 100644 index 0000000..8b01260 --- /dev/null +++ b/plugins/display/ip_to_geo.py @@ -0,0 +1,120 @@ +# -*- coding: utf-8 -*- +# +# Copyright Grégory Soutadé 2016 + +# This file is part of iwla + +# iwla is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# iwla is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with iwla. If not, see . +# + +import re + +from iwla import IWLA +from iplugin import IPlugin +from display import * + +import awstats_data + +""" +Display hook + +Add geo statistics + +Plugin requirements : + post_analysis/ip_to_geo + +Conf values needed : + create_geo_page* + +Output files : + OUTPUT_ROOT/year/month/index.html + +Statistics creation : + None + +Statistics update : + None + +Statistics deletion : + None +""" + +class IWLADisplayTopGeo(IPlugin): + def __init__(self, iwla): + super(IWLADisplayTopGeo, self).__init__(iwla) + self.API_VERSION = 1 + #self.requires = ['IWLAPostAnalysisIPToGeo'] + + def load(self): + self.icon_path = self.iwla.getConfValue('icon_path', '/') + self.create_geo_page = self.iwla.getConfValue('create_geo_page_page', True) + + display = self.iwla.getDisplay() + display.addColumnFilter(self.iwla._(u'Host'), self.FlagFilter, {'self':self}) + + return True + + @staticmethod # Needed to have unbound method + def FlagFilter(host, self): + cc = None + host_name = host.split(' ')[0] # hostname or ip + if host_name in self.valid_visitors.keys(): + cc = self.valid_visitors[host_name].get('country_code', None) + else: + for visitor in self.valid_visitors.values(): + if visitor['remote_addr'] == host_name: + cc = visitor.get('country_code', None) + break + if not cc or cc == 'ip': return None + icon = '%s flag' % (cc, self.icon_path, cc) + return '%s %s' % (icon ,host) + + def hook(self): + display = self.iwla.getDisplay() + geo = self.iwla.getMonthStats()['geo'] + geo = sorted(geo.items(), key=lambda t: t[1], reverse=True) + self.valid_visitors = self.iwla.getValidVisitors() + + # All in a page + if self.create_geo_page: + title = createCurTitle(self.iwla, u'All Coutries') + filename = 'geo.html' + path = self.iwla.getCurDisplayPath(filename) + + page = display.createPage(title, path, self.iwla.getConfValue('css_path', [])) + table = display.createBlock(DisplayHTMLBlockTable, self.iwla._(u'Countries'), ['', self.iwla._(u'Country'), self.iwla._(u'Visitors')]) + table.setColsCSSClass(['', '', 'iwla_hit']) + for (cc, visitors) in geo: + icon = '%s flag' % (cc, self.icon_path, cc) + table.appendRow([icon, cc, visitors]) + table.computeRatio(2) + page.appendBlock(table) + + display.addPage(page) + + # Countries in index + title = self.iwla._(u'Countries') + if self.create_geo_page: + link = '%s' % (filename, self.iwla._(u'Details')) + title = '%s - %s' % (title, link) + + index = self.iwla.getDisplayIndex() + + table = display.createBlock(DisplayHTMLBlockTable, title, ['', self.iwla._(u'Countries'), self.iwla._(u'Visitors')]) + table.setColsCSSClass(['', '', 'iwla_hit']) + for (cc, visitors) in geo[:10]: + icon = '%s flag' % (cc, self.icon_path, cc) + table.appendRow([icon, cc, visitors]) + table.computeRatio(2) + index.appendBlock(table) diff --git a/plugins/display/operating_systems.py b/plugins/display/operating_systems.py index 0b4324f..98bec17 100644 --- a/plugins/display/operating_systems.py +++ b/plugins/display/operating_systems.py @@ -78,7 +78,7 @@ class IWLADisplayTopOperatingSystems(IPlugin): table = display.createBlock(DisplayHTMLBlockTable, self.iwla._(u'Operating Systems'), ['', self.iwla._(u'Operating System'), self.iwla._(u'Entrance')]) table.setColsCSSClass(['', '', 'iwla_hit']) for (os_name, entrance) in operating_systems: - icon = '' % (self.icon_path, os_name) + icon = '%s icon' % (os_name, self.icon_path, os_name) table.appendRow([icon, os_name, entrance]) page.appendBlock(table) @@ -95,7 +95,7 @@ class IWLADisplayTopOperatingSystems(IPlugin): table = display.createBlock(DisplayHTMLBlockTable, title, ['', self.iwla._(u'Operating System'), self.iwla._(u'Entrance')]) table.setColsCSSClass(['', '', 'iwla_hit']) for (family, entrance) in os_families: - icon = '' % (self.icon_path, self.icon_names[family]) + icon = '%s icon' % (self.icon_names[family], self.icon_path, self.icon_names[family]) table.appendRow([icon, family, entrance]) table.computeRatio(2) index.appendBlock(table) diff --git a/plugins/display/track_users.py b/plugins/display/track_users.py index 53b7b9d..c653e4a 100644 --- a/plugins/display/track_users.py +++ b/plugins/display/track_users.py @@ -64,7 +64,7 @@ class IWLADisplayTrackUsers(IPlugin): def hook(self): display = self.iwla.getDisplay() - hits = self.iwla.getCurrentVisists() + hits = self.iwla.getCurrentVisits() stats = {} # All in a page @@ -110,7 +110,7 @@ class IWLADisplayTrackUsers(IPlugin): index = self.iwla.getDisplayIndex() - table = display.createBlock(DisplayHTMLBlockTable, title, [self.iwla._(u'IP'), self.iwla._(u'Last Access'), self.iwla._(u'Pages'), self.iwla._(u'Hits')]) + table = display.createBlock(DisplayHTMLBlockTable, title, [self.iwla._(u'Host'), self.iwla._(u'Last Access'), self.iwla._(u'Pages'), self.iwla._(u'Hits')]) table.setColsCSSClass(['', '', 'iwla_page', 'iwla_hit']) for ip in self.tracked_ip: if not ip in hits.keys(): continue diff --git a/plugins/post_analysis/feeds.py b/plugins/post_analysis/feeds.py index 8476881..570649f 100644 --- a/plugins/post_analysis/feeds.py +++ b/plugins/post_analysis/feeds.py @@ -85,7 +85,7 @@ class IWLAPostAnalysisFeeds(IPlugin): hit['feed_parser'] = isFeedParser def hook(self): - hits = self.iwla.getCurrentVisists() + hits = self.iwla.getCurrentVisits() one_hit_only = {} for hit in hits.values(): isFeedParser = hit.get('feed_parser', None) diff --git a/plugins/post_analysis/hours_stats.py b/plugins/post_analysis/hours_stats.py index a45dbdd..4ec9014 100644 --- a/plugins/post_analysis/hours_stats.py +++ b/plugins/post_analysis/hours_stats.py @@ -62,7 +62,7 @@ class IWLAPostAnalysisHoursStats(IPlugin): self.API_VERSION = 1 def hook(self): - stats = self.iwla.getCurrentVisists() + stats = self.iwla.getCurrentVisits() month_stats = self.iwla.getMonthStats() hours_stats = month_stats.get('hours_stats', {}) diff --git a/plugins/post_analysis/ip_to_geo.py b/plugins/post_analysis/ip_to_geo.py new file mode 100644 index 0000000..a15e016 --- /dev/null +++ b/plugins/post_analysis/ip_to_geo.py @@ -0,0 +1,92 @@ +# -*- coding: utf-8 -*- +# +# Copyright Grégory Soutadé 2016 + +# This file is part of iwla + +# iwla is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# iwla is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with iwla. If not, see . +# + +from iwla import IWLA +from iplugin import IPlugin + +from iptogeo import IPToGeo + +""" +Post analysis hook + +Get country code from IP address + +Plugin requirements : + None + +Conf values needed : + iptogeo_remote_addr* + iptogeo_remote_port* + +Output files : + None + +Statistics creation : + geo => + country_code => count + None + +Statistics update : +valid_visitors: + country_code + +Statistics deletion : + None +""" + +class IWLAPostAnalysisIPToGeo(IPlugin): + + def __init__(self, iwla): + super(IWLAPostAnalysisIPToGeo, self).__init__(iwla) + self.API_VERSION = 1 + + def load(self): + remote_addr = self.iwla.getConfValue('iptogeo_remote_addr', + None) + remote_port = self.iwla.getConfValue('iptogeo_remote_port', + None) + + args = {} + if remote_addr: args['remote_addr'] = remote_addr + if remote_port: args['remote_port'] = remote_port + self.iptogeo = IPToGeo(**args) + + return True + + def hook(self): + visitors = self.iwla.getValidVisitors() + month_stats = self.iwla.getMonthStats() + + geo = month_stats.get('geo', {}) + + for (ip, visitor) in visitors.items(): + if visitor.get('country_code', False): continue + try: + (_, cc) = self.iptogeo.ip_to_geo(ip) + cc = cc and cc or 'ip' + visitor['country_code'] = cc + if cc in geo.keys(): + geo[cc] += 1 + else: + geo[cc] = 1 + except Exception, e: + print e + + month_stats['geo'] = geo diff --git a/plugins/post_analysis/iptogeo.py b/plugins/post_analysis/iptogeo.py new file mode 100644 index 0000000..76a8d1c --- /dev/null +++ b/plugins/post_analysis/iptogeo.py @@ -0,0 +1,143 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# +# Copyright 2016 Grégory Soutadé +# +# This file is part of iptogeo. +# +# iptogeo is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# iptogeo is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with iptogeo. If not, see . +# + +import socket +import struct + +class IPToGeoException(Exception): + pass + +class IPToGeo(object): + + MAGIC = 0x179E08EF + VERSION = 1 + REQ = 1 + RESP = 0 + IPV4 = 4 + IPV6 = 16 + + IP_NOT_FOUND = 6 + + PACKET_SIZE = 32 + + ERRORS = {1 : 'Bad magic', + 2 : 'Bad version', + 3 : 'Bad request field' , + 4 : 'Bad IP version', + 5 : 'Unsupported IP version', + 6 : 'IP not found'} + + def __init__(self, remote_addr='127.0.0.1', remote_port=53333, timeout=None, family=socket.AF_INET): + self._remote_addr = remote_addr + self._remote_port = remote_port + self._timeout = timeout + self._family = family + + self._create_socket() + + def _create_socket(self): + self._socket = socket.socket(self._family, socket.SOCK_STREAM) + if not self._timeout is None: + self._socket.settimeout(self._timeout) + self._socket.connect((self._remote_addr, self._remote_port)) + + def _extend_ipv6(self, ipv6): + tmp = '' + for s in ipv6.split(':'): + if not s: break + while len(s) != 4: + s = '0' + s + tmp += s + while len(tmp) < 16*2: + tmp += '0' + res = '' + for i in range(0, 15*2, 2): + res += tmp[i] + tmp[i+1] + ':' + res += tmp[30] + tmp[31] + + return res + + def _create_request(self, ip, ip_type): + packet = '' + packet += struct.pack('= 0: + splitted_ip = [int(a) for a in ip.split('.')] + if len(splitted_ip) != 4: + raise Exception('Bad IP %s' % (ip)) + elif ip.find(':') >= 0: + splitted_ip = [int(a, 16) for a in self._extend_ipv6(ip).split(':')] + if len(splitted_ip) != 16: + raise Exception('Bad IP %s' % (ip)) + ip_type = IPToGeo.IPV6 + else: + raise Exception('Bad IP %s' % (ip)) + + packet = self._create_request(splitted_ip, ip_type) + try: + self._socket.send(packet) + except IOError, e: + # Give another chance (we may have been disconnected due to timeout) + self._create_socket() + self._socket.send(packet) + packet = self._socket.recv(IPToGeo.PACKET_SIZE) + if not packet: + raise IPToGeoException('Error, empty packet') + (ip, country_code) = self._check_request(packet) + if country_code: + # convert to string + country_code = '%c%c' % (country_code[0], country_code[1]) + return (ip, country_code) + + def close(self): + self._socket.close() diff --git a/plugins/post_analysis/referers.py b/plugins/post_analysis/referers.py index 619963f..aeceb8a 100644 --- a/plugins/post_analysis/referers.py +++ b/plugins/post_analysis/referers.py @@ -120,7 +120,7 @@ class IWLAPostAnalysisReferers(IPlugin): break def hook(self): - stats = self.iwla.getCurrentVisists() + stats = self.iwla.getCurrentVisits() month_stats = self.iwla.getMonthStats() referers = month_stats.get('referers', {}) diff --git a/plugins/post_analysis/reverse_dns.py b/plugins/post_analysis/reverse_dns.py index c63965f..8b04784 100644 --- a/plugins/post_analysis/reverse_dns.py +++ b/plugins/post_analysis/reverse_dns.py @@ -64,9 +64,12 @@ class IWLAPostAnalysisReverseDNS(IPlugin): return True def hook(self): - hits = self.iwla.getValidVisitors() + hits = self.iwla.getCurrentVisits() for (k, hit) in hits.items(): if hit.get('dns_analysed', False): continue + if not hit['feed_parser'] and\ + not self.iwla.isValidVisitor(hit): + continue try: name, _, _ = socket.gethostbyaddr(k) hit['remote_addr'] = name.lower() diff --git a/plugins/post_analysis/top_hits.py b/plugins/post_analysis/top_hits.py index 8006aa7..bc16ddc 100644 --- a/plugins/post_analysis/top_hits.py +++ b/plugins/post_analysis/top_hits.py @@ -53,7 +53,7 @@ class IWLAPostAnalysisTopHits(IPlugin): self.API_VERSION = 1 def hook(self): - stats = self.iwla.getCurrentVisists() + stats = self.iwla.getCurrentVisits() month_stats = self.iwla.getMonthStats() top_hits = month_stats.get('top_hits', {}) diff --git a/plugins/post_analysis/top_pages.py b/plugins/post_analysis/top_pages.py index 37db81d..1e649d3 100644 --- a/plugins/post_analysis/top_pages.py +++ b/plugins/post_analysis/top_pages.py @@ -59,7 +59,7 @@ class IWLAPostAnalysisTopPages(IPlugin): return True def hook(self): - stats = self.iwla.getCurrentVisists() + stats = self.iwla.getCurrentVisits() month_stats = self.iwla.getMonthStats() top_pages = month_stats.get('top_pages', {}) diff --git a/plugins/pre_analysis/page_to_hit.py b/plugins/pre_analysis/page_to_hit.py index 282f53f..9d8765b 100644 --- a/plugins/pre_analysis/page_to_hit.py +++ b/plugins/pre_analysis/page_to_hit.py @@ -69,7 +69,7 @@ class IWLAPreAnalysisPageToHit(IPlugin): return True def hook(self): - hits = self.iwla.getCurrentVisists() + hits = self.iwla.getCurrentVisits() for (k, super_hit) in hits.items(): if super_hit['robot']: continue diff --git a/plugins/pre_analysis/robots.py b/plugins/pre_analysis/robots.py index d84087d..6f89bb3 100644 --- a/plugins/pre_analysis/robots.py +++ b/plugins/pre_analysis/robots.py @@ -76,7 +76,7 @@ class IWLAPreAnalysisRobots(IPlugin): # Basic rule to detect robots def hook(self): - hits = self.iwla.getCurrentVisists() + hits = self.iwla.getCurrentVisits() for (k, super_hit) in hits.items(): if super_hit['robot']: self.logger.debug('%s is a robot' % (k)) diff --git a/resources/icon/flags/a2.png b/resources/icon/flags/a2.png new file mode 100644 index 0000000..30dd64a Binary files /dev/null and b/resources/icon/flags/a2.png differ diff --git a/resources/icon/flags/ac.png b/resources/icon/flags/ac.png new file mode 100644 index 0000000..4f154f8 Binary files /dev/null and b/resources/icon/flags/ac.png differ diff --git a/resources/icon/flags/ad.png b/resources/icon/flags/ad.png new file mode 100644 index 0000000..f676f64 Binary files /dev/null and b/resources/icon/flags/ad.png differ diff --git a/resources/icon/flags/ae.png b/resources/icon/flags/ae.png new file mode 100644 index 0000000..c6952aa Binary files /dev/null and b/resources/icon/flags/ae.png differ diff --git a/resources/icon/flags/aero.png b/resources/icon/flags/aero.png new file mode 100644 index 0000000..0d37472 Binary files /dev/null and b/resources/icon/flags/aero.png differ diff --git a/resources/icon/flags/af.png b/resources/icon/flags/af.png new file mode 100644 index 0000000..582fc06 Binary files /dev/null and b/resources/icon/flags/af.png differ diff --git a/resources/icon/flags/ag.png b/resources/icon/flags/ag.png new file mode 100644 index 0000000..fbf917c Binary files /dev/null and b/resources/icon/flags/ag.png differ diff --git a/resources/icon/flags/ai.png b/resources/icon/flags/ai.png new file mode 100644 index 0000000..badcd96 Binary files /dev/null and b/resources/icon/flags/ai.png differ diff --git a/resources/icon/flags/al.png b/resources/icon/flags/al.png new file mode 100644 index 0000000..2ff7780 Binary files /dev/null and b/resources/icon/flags/al.png differ diff --git a/resources/icon/flags/am.png b/resources/icon/flags/am.png new file mode 100644 index 0000000..c8e056b Binary files /dev/null and b/resources/icon/flags/am.png differ diff --git a/resources/icon/flags/an.png b/resources/icon/flags/an.png new file mode 100644 index 0000000..6b0f085 Binary files /dev/null and b/resources/icon/flags/an.png differ diff --git a/resources/icon/flags/ao.png b/resources/icon/flags/ao.png new file mode 100644 index 0000000..127796d Binary files /dev/null and b/resources/icon/flags/ao.png differ diff --git a/resources/icon/flags/aq.png b/resources/icon/flags/aq.png new file mode 100644 index 0000000..dc6b1ab Binary files /dev/null and b/resources/icon/flags/aq.png differ diff --git a/resources/icon/flags/ar.png b/resources/icon/flags/ar.png new file mode 100644 index 0000000..755b40e Binary files /dev/null and b/resources/icon/flags/ar.png differ diff --git a/resources/icon/flags/arpa.png b/resources/icon/flags/arpa.png new file mode 100644 index 0000000..4502b8d Binary files /dev/null and b/resources/icon/flags/arpa.png differ diff --git a/resources/icon/flags/as.png b/resources/icon/flags/as.png new file mode 100644 index 0000000..614d01d Binary files /dev/null and b/resources/icon/flags/as.png differ diff --git a/resources/icon/flags/at.png b/resources/icon/flags/at.png new file mode 100644 index 0000000..7982808 Binary files /dev/null and b/resources/icon/flags/at.png differ diff --git a/resources/icon/flags/au.png b/resources/icon/flags/au.png new file mode 100644 index 0000000..595bff6 Binary files /dev/null and b/resources/icon/flags/au.png differ diff --git a/resources/icon/flags/aw.png b/resources/icon/flags/aw.png new file mode 100644 index 0000000..4aa502c Binary files /dev/null and b/resources/icon/flags/aw.png differ diff --git a/resources/icon/flags/ax.png b/resources/icon/flags/ax.png new file mode 100644 index 0000000..e43bf0a Binary files /dev/null and b/resources/icon/flags/ax.png differ diff --git a/resources/icon/flags/az.png b/resources/icon/flags/az.png new file mode 100644 index 0000000..d07d9b4 Binary files /dev/null and b/resources/icon/flags/az.png differ diff --git a/resources/icon/flags/ba.png b/resources/icon/flags/ba.png new file mode 100644 index 0000000..42c31e9 Binary files /dev/null and b/resources/icon/flags/ba.png differ diff --git a/resources/icon/flags/bb.png b/resources/icon/flags/bb.png new file mode 100644 index 0000000..88e4e67 Binary files /dev/null and b/resources/icon/flags/bb.png differ diff --git a/resources/icon/flags/bd.png b/resources/icon/flags/bd.png new file mode 100644 index 0000000..b49714a Binary files /dev/null and b/resources/icon/flags/bd.png differ diff --git a/resources/icon/flags/be.png b/resources/icon/flags/be.png new file mode 100644 index 0000000..872f562 Binary files /dev/null and b/resources/icon/flags/be.png differ diff --git a/resources/icon/flags/bf.png b/resources/icon/flags/bf.png new file mode 100644 index 0000000..9151366 Binary files /dev/null and b/resources/icon/flags/bf.png differ diff --git a/resources/icon/flags/bg.png b/resources/icon/flags/bg.png new file mode 100644 index 0000000..2c1f46b Binary files /dev/null and b/resources/icon/flags/bg.png differ diff --git a/resources/icon/flags/bh.png b/resources/icon/flags/bh.png new file mode 100644 index 0000000..1b0d04d Binary files /dev/null and b/resources/icon/flags/bh.png differ diff --git a/resources/icon/flags/bi.png b/resources/icon/flags/bi.png new file mode 100644 index 0000000..518e030 Binary files /dev/null and b/resources/icon/flags/bi.png differ diff --git a/resources/icon/flags/biz.png b/resources/icon/flags/biz.png new file mode 100644 index 0000000..7bd40c2 Binary files /dev/null and b/resources/icon/flags/biz.png differ diff --git a/resources/icon/flags/bj.png b/resources/icon/flags/bj.png new file mode 100644 index 0000000..6473bf1 Binary files /dev/null and b/resources/icon/flags/bj.png differ diff --git a/resources/icon/flags/bm.png b/resources/icon/flags/bm.png new file mode 100644 index 0000000..9ea8c4f Binary files /dev/null and b/resources/icon/flags/bm.png differ diff --git a/resources/icon/flags/bn.png b/resources/icon/flags/bn.png new file mode 100644 index 0000000..2585a38 Binary files /dev/null and b/resources/icon/flags/bn.png differ diff --git a/resources/icon/flags/bo.png b/resources/icon/flags/bo.png new file mode 100644 index 0000000..27025ca Binary files /dev/null and b/resources/icon/flags/bo.png differ diff --git a/resources/icon/flags/br.png b/resources/icon/flags/br.png new file mode 100644 index 0000000..f94d2e2 Binary files /dev/null and b/resources/icon/flags/br.png differ diff --git a/resources/icon/flags/bs.png b/resources/icon/flags/bs.png new file mode 100644 index 0000000..0eaa50d Binary files /dev/null and b/resources/icon/flags/bs.png differ diff --git a/resources/icon/flags/bt.png b/resources/icon/flags/bt.png new file mode 100644 index 0000000..e12aa33 Binary files /dev/null and b/resources/icon/flags/bt.png differ diff --git a/resources/icon/flags/bv.png b/resources/icon/flags/bv.png new file mode 100644 index 0000000..e75a6c8 Binary files /dev/null and b/resources/icon/flags/bv.png differ diff --git a/resources/icon/flags/bw.png b/resources/icon/flags/bw.png new file mode 100644 index 0000000..c224fcd Binary files /dev/null and b/resources/icon/flags/bw.png differ diff --git a/resources/icon/flags/by.png b/resources/icon/flags/by.png new file mode 100644 index 0000000..c3f4713 Binary files /dev/null and b/resources/icon/flags/by.png differ diff --git a/resources/icon/flags/bz.png b/resources/icon/flags/bz.png new file mode 100644 index 0000000..378ec4a Binary files /dev/null and b/resources/icon/flags/bz.png differ diff --git a/resources/icon/flags/ca.png b/resources/icon/flags/ca.png new file mode 100644 index 0000000..38a5ae6 Binary files /dev/null and b/resources/icon/flags/ca.png differ diff --git a/resources/icon/flags/cc.png b/resources/icon/flags/cc.png new file mode 100644 index 0000000..0050bab Binary files /dev/null and b/resources/icon/flags/cc.png differ diff --git a/resources/icon/flags/cd.png b/resources/icon/flags/cd.png new file mode 100644 index 0000000..f50b0ae Binary files /dev/null and b/resources/icon/flags/cd.png differ diff --git a/resources/icon/flags/cf.png b/resources/icon/flags/cf.png new file mode 100644 index 0000000..fcca6fd Binary files /dev/null and b/resources/icon/flags/cf.png differ diff --git a/resources/icon/flags/cg.png b/resources/icon/flags/cg.png new file mode 100644 index 0000000..14ada0a Binary files /dev/null and b/resources/icon/flags/cg.png differ diff --git a/resources/icon/flags/ch.png b/resources/icon/flags/ch.png new file mode 100644 index 0000000..681c706 Binary files /dev/null and b/resources/icon/flags/ch.png differ diff --git a/resources/icon/flags/ci.png b/resources/icon/flags/ci.png new file mode 100644 index 0000000..53a7ccd Binary files /dev/null and b/resources/icon/flags/ci.png differ diff --git a/resources/icon/flags/ck.png b/resources/icon/flags/ck.png new file mode 100644 index 0000000..18b5fe1 Binary files /dev/null and b/resources/icon/flags/ck.png differ diff --git a/resources/icon/flags/cl.png b/resources/icon/flags/cl.png new file mode 100644 index 0000000..98992c6 Binary files /dev/null and b/resources/icon/flags/cl.png differ diff --git a/resources/icon/flags/cm.png b/resources/icon/flags/cm.png new file mode 100644 index 0000000..4ab7c60 Binary files /dev/null and b/resources/icon/flags/cm.png differ diff --git a/resources/icon/flags/cn.png b/resources/icon/flags/cn.png new file mode 100644 index 0000000..f83bbe1 Binary files /dev/null and b/resources/icon/flags/cn.png differ diff --git a/resources/icon/flags/co.png b/resources/icon/flags/co.png new file mode 100644 index 0000000..9c1d3cc Binary files /dev/null and b/resources/icon/flags/co.png differ diff --git a/resources/icon/flags/com.png b/resources/icon/flags/com.png new file mode 100644 index 0000000..114dba3 Binary files /dev/null and b/resources/icon/flags/com.png differ diff --git a/resources/icon/flags/coop.png b/resources/icon/flags/coop.png new file mode 100644 index 0000000..114dba3 Binary files /dev/null and b/resources/icon/flags/coop.png differ diff --git a/resources/icon/flags/cr.png b/resources/icon/flags/cr.png new file mode 100644 index 0000000..a3d8933 Binary files /dev/null and b/resources/icon/flags/cr.png differ diff --git a/resources/icon/flags/cs.png b/resources/icon/flags/cs.png new file mode 100644 index 0000000..8ca1fb6 Binary files /dev/null and b/resources/icon/flags/cs.png differ diff --git a/resources/icon/flags/cu.png b/resources/icon/flags/cu.png new file mode 100644 index 0000000..16b2b3a Binary files /dev/null and b/resources/icon/flags/cu.png differ diff --git a/resources/icon/flags/cv.png b/resources/icon/flags/cv.png new file mode 100644 index 0000000..9de2cb6 Binary files /dev/null and b/resources/icon/flags/cv.png differ diff --git a/resources/icon/flags/cx.png b/resources/icon/flags/cx.png new file mode 100644 index 0000000..d4273dd Binary files /dev/null and b/resources/icon/flags/cx.png differ diff --git a/resources/icon/flags/cy.png b/resources/icon/flags/cy.png new file mode 100644 index 0000000..57fcca7 Binary files /dev/null and b/resources/icon/flags/cy.png differ diff --git a/resources/icon/flags/cz.png b/resources/icon/flags/cz.png new file mode 100644 index 0000000..8ca1fb6 Binary files /dev/null and b/resources/icon/flags/cz.png differ diff --git a/resources/icon/flags/de.png b/resources/icon/flags/de.png new file mode 100644 index 0000000..ff85c66 Binary files /dev/null and b/resources/icon/flags/de.png differ diff --git a/resources/icon/flags/dj.png b/resources/icon/flags/dj.png new file mode 100644 index 0000000..bb98a86 Binary files /dev/null and b/resources/icon/flags/dj.png differ diff --git a/resources/icon/flags/dk.png b/resources/icon/flags/dk.png new file mode 100644 index 0000000..7986a0f Binary files /dev/null and b/resources/icon/flags/dk.png differ diff --git a/resources/icon/flags/dm.png b/resources/icon/flags/dm.png new file mode 100644 index 0000000..34e4fb3 Binary files /dev/null and b/resources/icon/flags/dm.png differ diff --git a/resources/icon/flags/do.png b/resources/icon/flags/do.png new file mode 100644 index 0000000..e0c37d6 Binary files /dev/null and b/resources/icon/flags/do.png differ diff --git a/resources/icon/flags/dz.png b/resources/icon/flags/dz.png new file mode 100644 index 0000000..6454fa8 Binary files /dev/null and b/resources/icon/flags/dz.png differ diff --git a/resources/icon/flags/ec.png b/resources/icon/flags/ec.png new file mode 100644 index 0000000..3dc0528 Binary files /dev/null and b/resources/icon/flags/ec.png differ diff --git a/resources/icon/flags/edu.png b/resources/icon/flags/edu.png new file mode 100644 index 0000000..78d0951 Binary files /dev/null and b/resources/icon/flags/edu.png differ diff --git a/resources/icon/flags/ee.png b/resources/icon/flags/ee.png new file mode 100644 index 0000000..80763f0 Binary files /dev/null and b/resources/icon/flags/ee.png differ diff --git a/resources/icon/flags/eg.png b/resources/icon/flags/eg.png new file mode 100644 index 0000000..71947de Binary files /dev/null and b/resources/icon/flags/eg.png differ diff --git a/resources/icon/flags/eh.png b/resources/icon/flags/eh.png new file mode 100644 index 0000000..d518ea5 Binary files /dev/null and b/resources/icon/flags/eh.png differ diff --git a/resources/icon/flags/en.png b/resources/icon/flags/en.png new file mode 100644 index 0000000..5de202b Binary files /dev/null and b/resources/icon/flags/en.png differ diff --git a/resources/icon/flags/er.png b/resources/icon/flags/er.png new file mode 100644 index 0000000..b21bb88 Binary files /dev/null and b/resources/icon/flags/er.png differ diff --git a/resources/icon/flags/es.png b/resources/icon/flags/es.png new file mode 100644 index 0000000..09a7531 Binary files /dev/null and b/resources/icon/flags/es.png differ diff --git a/resources/icon/flags/es_cat.png b/resources/icon/flags/es_cat.png new file mode 100644 index 0000000..41b1410 Binary files /dev/null and b/resources/icon/flags/es_cat.png differ diff --git a/resources/icon/flags/es_eu.png b/resources/icon/flags/es_eu.png new file mode 100644 index 0000000..462be61 Binary files /dev/null and b/resources/icon/flags/es_eu.png differ diff --git a/resources/icon/flags/et.png b/resources/icon/flags/et.png new file mode 100644 index 0000000..dc8f7f0 Binary files /dev/null and b/resources/icon/flags/et.png differ diff --git a/resources/icon/flags/eu.png b/resources/icon/flags/eu.png new file mode 100644 index 0000000..eec69ea Binary files /dev/null and b/resources/icon/flags/eu.png differ diff --git a/resources/icon/flags/fi.png b/resources/icon/flags/fi.png new file mode 100644 index 0000000..2a5ffe1 Binary files /dev/null and b/resources/icon/flags/fi.png differ diff --git a/resources/icon/flags/fj.png b/resources/icon/flags/fj.png new file mode 100644 index 0000000..91b022c Binary files /dev/null and b/resources/icon/flags/fj.png differ diff --git a/resources/icon/flags/fk.png b/resources/icon/flags/fk.png new file mode 100644 index 0000000..08e7110 Binary files /dev/null and b/resources/icon/flags/fk.png differ diff --git a/resources/icon/flags/fm.png b/resources/icon/flags/fm.png new file mode 100644 index 0000000..6364ebd Binary files /dev/null and b/resources/icon/flags/fm.png differ diff --git a/resources/icon/flags/fo.png b/resources/icon/flags/fo.png new file mode 100644 index 0000000..7228cad Binary files /dev/null and b/resources/icon/flags/fo.png differ diff --git a/resources/icon/flags/fr.png b/resources/icon/flags/fr.png new file mode 100644 index 0000000..aea1151 Binary files /dev/null and b/resources/icon/flags/fr.png differ diff --git a/resources/icon/flags/fx.png b/resources/icon/flags/fx.png new file mode 100644 index 0000000..aea1151 Binary files /dev/null and b/resources/icon/flags/fx.png differ diff --git a/resources/icon/flags/ga.png b/resources/icon/flags/ga.png new file mode 100644 index 0000000..5208c02 Binary files /dev/null and b/resources/icon/flags/ga.png differ diff --git a/resources/icon/flags/gb.png b/resources/icon/flags/gb.png new file mode 100644 index 0000000..2b8cdde Binary files /dev/null and b/resources/icon/flags/gb.png differ diff --git a/resources/icon/flags/gd.png b/resources/icon/flags/gd.png new file mode 100644 index 0000000..318dcdc Binary files /dev/null and b/resources/icon/flags/gd.png differ diff --git a/resources/icon/flags/ge.png b/resources/icon/flags/ge.png new file mode 100644 index 0000000..0907b86 Binary files /dev/null and b/resources/icon/flags/ge.png differ diff --git a/resources/icon/flags/gf.png b/resources/icon/flags/gf.png new file mode 100644 index 0000000..4ac9c2c Binary files /dev/null and b/resources/icon/flags/gf.png differ diff --git a/resources/icon/flags/gg.png b/resources/icon/flags/gg.png new file mode 100644 index 0000000..2053db6 Binary files /dev/null and b/resources/icon/flags/gg.png differ diff --git a/resources/icon/flags/gh.png b/resources/icon/flags/gh.png new file mode 100644 index 0000000..0b4e4f1 Binary files /dev/null and b/resources/icon/flags/gh.png differ diff --git a/resources/icon/flags/gi.png b/resources/icon/flags/gi.png new file mode 100644 index 0000000..023a4f7 Binary files /dev/null and b/resources/icon/flags/gi.png differ diff --git a/resources/icon/flags/gl.png b/resources/icon/flags/gl.png new file mode 100644 index 0000000..2b4a291 Binary files /dev/null and b/resources/icon/flags/gl.png differ diff --git a/resources/icon/flags/glg.png b/resources/icon/flags/glg.png new file mode 100644 index 0000000..0610c23 Binary files /dev/null and b/resources/icon/flags/glg.png differ diff --git a/resources/icon/flags/gm.png b/resources/icon/flags/gm.png new file mode 100644 index 0000000..75c58fb Binary files /dev/null and b/resources/icon/flags/gm.png differ diff --git a/resources/icon/flags/gn.png b/resources/icon/flags/gn.png new file mode 100644 index 0000000..55b87f6 Binary files /dev/null and b/resources/icon/flags/gn.png differ diff --git a/resources/icon/flags/gov.png b/resources/icon/flags/gov.png new file mode 100644 index 0000000..a293ebd Binary files /dev/null and b/resources/icon/flags/gov.png differ diff --git a/resources/icon/flags/gp.png b/resources/icon/flags/gp.png new file mode 100644 index 0000000..89ece94 Binary files /dev/null and b/resources/icon/flags/gp.png differ diff --git a/resources/icon/flags/gq.png b/resources/icon/flags/gq.png new file mode 100644 index 0000000..a2ff841 Binary files /dev/null and b/resources/icon/flags/gq.png differ diff --git a/resources/icon/flags/gr.png b/resources/icon/flags/gr.png new file mode 100644 index 0000000..ddd9f17 Binary files /dev/null and b/resources/icon/flags/gr.png differ diff --git a/resources/icon/flags/gs.png b/resources/icon/flags/gs.png new file mode 100644 index 0000000..5f779ec Binary files /dev/null and b/resources/icon/flags/gs.png differ diff --git a/resources/icon/flags/gt.png b/resources/icon/flags/gt.png new file mode 100644 index 0000000..455820b Binary files /dev/null and b/resources/icon/flags/gt.png differ diff --git a/resources/icon/flags/gu.png b/resources/icon/flags/gu.png new file mode 100644 index 0000000..0ea9ba6 Binary files /dev/null and b/resources/icon/flags/gu.png differ diff --git a/resources/icon/flags/gw.png b/resources/icon/flags/gw.png new file mode 100644 index 0000000..12f71fc Binary files /dev/null and b/resources/icon/flags/gw.png differ diff --git a/resources/icon/flags/gy.png b/resources/icon/flags/gy.png new file mode 100644 index 0000000..e006994 Binary files /dev/null and b/resources/icon/flags/gy.png differ diff --git a/resources/icon/flags/hk.png b/resources/icon/flags/hk.png new file mode 100644 index 0000000..a2b12f0 Binary files /dev/null and b/resources/icon/flags/hk.png differ diff --git a/resources/icon/flags/hm.png b/resources/icon/flags/hm.png new file mode 100644 index 0000000..06e0ec6 Binary files /dev/null and b/resources/icon/flags/hm.png differ diff --git a/resources/icon/flags/hn.png b/resources/icon/flags/hn.png new file mode 100644 index 0000000..292c1b1 Binary files /dev/null and b/resources/icon/flags/hn.png differ diff --git a/resources/icon/flags/hr.png b/resources/icon/flags/hr.png new file mode 100644 index 0000000..e3bb792 Binary files /dev/null and b/resources/icon/flags/hr.png differ diff --git a/resources/icon/flags/ht.png b/resources/icon/flags/ht.png new file mode 100644 index 0000000..237e758 Binary files /dev/null and b/resources/icon/flags/ht.png differ diff --git a/resources/icon/flags/hu.png b/resources/icon/flags/hu.png new file mode 100644 index 0000000..ade6808 Binary files /dev/null and b/resources/icon/flags/hu.png differ diff --git a/resources/icon/flags/i0.png b/resources/icon/flags/i0.png new file mode 100644 index 0000000..4502b8d Binary files /dev/null and b/resources/icon/flags/i0.png differ diff --git a/resources/icon/flags/id.png b/resources/icon/flags/id.png new file mode 100644 index 0000000..3fb4905 Binary files /dev/null and b/resources/icon/flags/id.png differ diff --git a/resources/icon/flags/ie.png b/resources/icon/flags/ie.png new file mode 100644 index 0000000..9029a23 Binary files /dev/null and b/resources/icon/flags/ie.png differ diff --git a/resources/icon/flags/il.png b/resources/icon/flags/il.png new file mode 100644 index 0000000..deacbf4 Binary files /dev/null and b/resources/icon/flags/il.png differ diff --git a/resources/icon/flags/im.png b/resources/icon/flags/im.png new file mode 100644 index 0000000..7e9b7c9 Binary files /dev/null and b/resources/icon/flags/im.png differ diff --git a/resources/icon/flags/in.png b/resources/icon/flags/in.png new file mode 100644 index 0000000..fca700e Binary files /dev/null and b/resources/icon/flags/in.png differ diff --git a/resources/icon/flags/info.png b/resources/icon/flags/info.png new file mode 100644 index 0000000..7bd40c2 Binary files /dev/null and b/resources/icon/flags/info.png differ diff --git a/resources/icon/flags/int.png b/resources/icon/flags/int.png new file mode 100644 index 0000000..2f1a781 Binary files /dev/null and b/resources/icon/flags/int.png differ diff --git a/resources/icon/flags/io.png b/resources/icon/flags/io.png new file mode 100644 index 0000000..a64095c Binary files /dev/null and b/resources/icon/flags/io.png differ diff --git a/resources/icon/flags/ip.png b/resources/icon/flags/ip.png new file mode 100644 index 0000000..883082b Binary files /dev/null and b/resources/icon/flags/ip.png differ diff --git a/resources/icon/flags/iq.png b/resources/icon/flags/iq.png new file mode 100644 index 0000000..5225164 Binary files /dev/null and b/resources/icon/flags/iq.png differ diff --git a/resources/icon/flags/ir.png b/resources/icon/flags/ir.png new file mode 100644 index 0000000..51da41e Binary files /dev/null and b/resources/icon/flags/ir.png differ diff --git a/resources/icon/flags/is.png b/resources/icon/flags/is.png new file mode 100644 index 0000000..d91c583 Binary files /dev/null and b/resources/icon/flags/is.png differ diff --git a/resources/icon/flags/it.png b/resources/icon/flags/it.png new file mode 100644 index 0000000..879296f Binary files /dev/null and b/resources/icon/flags/it.png differ diff --git a/resources/icon/flags/jm.png b/resources/icon/flags/jm.png new file mode 100644 index 0000000..980f613 Binary files /dev/null and b/resources/icon/flags/jm.png differ diff --git a/resources/icon/flags/jo.png b/resources/icon/flags/jo.png new file mode 100644 index 0000000..90f6cc5 Binary files /dev/null and b/resources/icon/flags/jo.png differ diff --git a/resources/icon/flags/jp.png b/resources/icon/flags/jp.png new file mode 100644 index 0000000..8655f75 Binary files /dev/null and b/resources/icon/flags/jp.png differ diff --git a/resources/icon/flags/ke.png b/resources/icon/flags/ke.png new file mode 100644 index 0000000..a4eb346 Binary files /dev/null and b/resources/icon/flags/ke.png differ diff --git a/resources/icon/flags/kg.png b/resources/icon/flags/kg.png new file mode 100644 index 0000000..c765f83 Binary files /dev/null and b/resources/icon/flags/kg.png differ diff --git a/resources/icon/flags/kh.png b/resources/icon/flags/kh.png new file mode 100644 index 0000000..d43f060 Binary files /dev/null and b/resources/icon/flags/kh.png differ diff --git a/resources/icon/flags/ki.png b/resources/icon/flags/ki.png new file mode 100644 index 0000000..2de8785 Binary files /dev/null and b/resources/icon/flags/ki.png differ diff --git a/resources/icon/flags/km.png b/resources/icon/flags/km.png new file mode 100644 index 0000000..335526d Binary files /dev/null and b/resources/icon/flags/km.png differ diff --git a/resources/icon/flags/kn.png b/resources/icon/flags/kn.png new file mode 100644 index 0000000..be2d801 Binary files /dev/null and b/resources/icon/flags/kn.png differ diff --git a/resources/icon/flags/kp.png b/resources/icon/flags/kp.png new file mode 100644 index 0000000..2430525 Binary files /dev/null and b/resources/icon/flags/kp.png differ diff --git a/resources/icon/flags/kr.png b/resources/icon/flags/kr.png new file mode 100644 index 0000000..48098aa Binary files /dev/null and b/resources/icon/flags/kr.png differ diff --git a/resources/icon/flags/kw.png b/resources/icon/flags/kw.png new file mode 100644 index 0000000..94fc856 Binary files /dev/null and b/resources/icon/flags/kw.png differ diff --git a/resources/icon/flags/ky.png b/resources/icon/flags/ky.png new file mode 100644 index 0000000..e278582 Binary files /dev/null and b/resources/icon/flags/ky.png differ diff --git a/resources/icon/flags/kz.png b/resources/icon/flags/kz.png new file mode 100644 index 0000000..b158cd9 Binary files /dev/null and b/resources/icon/flags/kz.png differ diff --git a/resources/icon/flags/la.png b/resources/icon/flags/la.png new file mode 100644 index 0000000..7550211 Binary files /dev/null and b/resources/icon/flags/la.png differ diff --git a/resources/icon/flags/lb.png b/resources/icon/flags/lb.png new file mode 100644 index 0000000..2996d75 Binary files /dev/null and b/resources/icon/flags/lb.png differ diff --git a/resources/icon/flags/lc.png b/resources/icon/flags/lc.png new file mode 100644 index 0000000..d6ae67b Binary files /dev/null and b/resources/icon/flags/lc.png differ diff --git a/resources/icon/flags/li.png b/resources/icon/flags/li.png new file mode 100644 index 0000000..1a601d9 Binary files /dev/null and b/resources/icon/flags/li.png differ diff --git a/resources/icon/flags/lk.png b/resources/icon/flags/lk.png new file mode 100644 index 0000000..1517840 Binary files /dev/null and b/resources/icon/flags/lk.png differ diff --git a/resources/icon/flags/lr.png b/resources/icon/flags/lr.png new file mode 100644 index 0000000..4cd00f3 Binary files /dev/null and b/resources/icon/flags/lr.png differ diff --git a/resources/icon/flags/ls.png b/resources/icon/flags/ls.png new file mode 100644 index 0000000..8fff881 Binary files /dev/null and b/resources/icon/flags/ls.png differ diff --git a/resources/icon/flags/lt.png b/resources/icon/flags/lt.png new file mode 100644 index 0000000..edbb143 Binary files /dev/null and b/resources/icon/flags/lt.png differ diff --git a/resources/icon/flags/lu.png b/resources/icon/flags/lu.png new file mode 100644 index 0000000..9b6e836 Binary files /dev/null and b/resources/icon/flags/lu.png differ diff --git a/resources/icon/flags/lv.png b/resources/icon/flags/lv.png new file mode 100644 index 0000000..90fdf8f Binary files /dev/null and b/resources/icon/flags/lv.png differ diff --git a/resources/icon/flags/ly.png b/resources/icon/flags/ly.png new file mode 100644 index 0000000..07653b6 Binary files /dev/null and b/resources/icon/flags/ly.png differ diff --git a/resources/icon/flags/ma.png b/resources/icon/flags/ma.png new file mode 100644 index 0000000..5e43d7c Binary files /dev/null and b/resources/icon/flags/ma.png differ diff --git a/resources/icon/flags/mc.png b/resources/icon/flags/mc.png new file mode 100644 index 0000000..71c462a Binary files /dev/null and b/resources/icon/flags/mc.png differ diff --git a/resources/icon/flags/md.png b/resources/icon/flags/md.png new file mode 100644 index 0000000..8f7357b Binary files /dev/null and b/resources/icon/flags/md.png differ diff --git a/resources/icon/flags/me.png b/resources/icon/flags/me.png new file mode 100644 index 0000000..c89f413 Binary files /dev/null and b/resources/icon/flags/me.png differ diff --git a/resources/icon/flags/mg.png b/resources/icon/flags/mg.png new file mode 100644 index 0000000..d614548 Binary files /dev/null and b/resources/icon/flags/mg.png differ diff --git a/resources/icon/flags/mil.png b/resources/icon/flags/mil.png new file mode 100644 index 0000000..898a255 Binary files /dev/null and b/resources/icon/flags/mil.png differ diff --git a/resources/icon/flags/mk.png b/resources/icon/flags/mk.png new file mode 100644 index 0000000..578266d Binary files /dev/null and b/resources/icon/flags/mk.png differ diff --git a/resources/icon/flags/ml.png b/resources/icon/flags/ml.png new file mode 100644 index 0000000..8994e0f Binary files /dev/null and b/resources/icon/flags/ml.png differ diff --git a/resources/icon/flags/mm.png b/resources/icon/flags/mm.png new file mode 100644 index 0000000..d204ca1 Binary files /dev/null and b/resources/icon/flags/mm.png differ diff --git a/resources/icon/flags/mn.png b/resources/icon/flags/mn.png new file mode 100644 index 0000000..407510f Binary files /dev/null and b/resources/icon/flags/mn.png differ diff --git a/resources/icon/flags/mo.png b/resources/icon/flags/mo.png new file mode 100644 index 0000000..6f7ced4 Binary files /dev/null and b/resources/icon/flags/mo.png differ diff --git a/resources/icon/flags/mp.png b/resources/icon/flags/mp.png new file mode 100644 index 0000000..79d2293 Binary files /dev/null and b/resources/icon/flags/mp.png differ diff --git a/resources/icon/flags/mq.png b/resources/icon/flags/mq.png new file mode 100644 index 0000000..053f950 Binary files /dev/null and b/resources/icon/flags/mq.png differ diff --git a/resources/icon/flags/mr.png b/resources/icon/flags/mr.png new file mode 100644 index 0000000..4e8e04e Binary files /dev/null and b/resources/icon/flags/mr.png differ diff --git a/resources/icon/flags/ms.png b/resources/icon/flags/ms.png new file mode 100644 index 0000000..286cabd Binary files /dev/null and b/resources/icon/flags/ms.png differ diff --git a/resources/icon/flags/mt.png b/resources/icon/flags/mt.png new file mode 100644 index 0000000..83e20a0 Binary files /dev/null and b/resources/icon/flags/mt.png differ diff --git a/resources/icon/flags/mu.png b/resources/icon/flags/mu.png new file mode 100644 index 0000000..e51da3d Binary files /dev/null and b/resources/icon/flags/mu.png differ diff --git a/resources/icon/flags/museum.png b/resources/icon/flags/museum.png new file mode 100644 index 0000000..7bd40c2 Binary files /dev/null and b/resources/icon/flags/museum.png differ diff --git a/resources/icon/flags/mv.png b/resources/icon/flags/mv.png new file mode 100644 index 0000000..449b944 Binary files /dev/null and b/resources/icon/flags/mv.png differ diff --git a/resources/icon/flags/mw.png b/resources/icon/flags/mw.png new file mode 100644 index 0000000..50d32c0 Binary files /dev/null and b/resources/icon/flags/mw.png differ diff --git a/resources/icon/flags/mx.png b/resources/icon/flags/mx.png new file mode 100644 index 0000000..ebd2b79 Binary files /dev/null and b/resources/icon/flags/mx.png differ diff --git a/resources/icon/flags/my.png b/resources/icon/flags/my.png new file mode 100644 index 0000000..1cb6139 Binary files /dev/null and b/resources/icon/flags/my.png differ diff --git a/resources/icon/flags/mz.png b/resources/icon/flags/mz.png new file mode 100644 index 0000000..1a949ca Binary files /dev/null and b/resources/icon/flags/mz.png differ diff --git a/resources/icon/flags/na.png b/resources/icon/flags/na.png new file mode 100644 index 0000000..c1d5687 Binary files /dev/null and b/resources/icon/flags/na.png differ diff --git a/resources/icon/flags/name.png b/resources/icon/flags/name.png new file mode 100644 index 0000000..6767617 Binary files /dev/null and b/resources/icon/flags/name.png differ diff --git a/resources/icon/flags/nato.png b/resources/icon/flags/nato.png new file mode 100644 index 0000000..bd90ac8 Binary files /dev/null and b/resources/icon/flags/nato.png differ diff --git a/resources/icon/flags/nb.png b/resources/icon/flags/nb.png new file mode 100644 index 0000000..76cea41 Binary files /dev/null and b/resources/icon/flags/nb.png differ diff --git a/resources/icon/flags/nc.png b/resources/icon/flags/nc.png new file mode 100644 index 0000000..aea1151 Binary files /dev/null and b/resources/icon/flags/nc.png differ diff --git a/resources/icon/flags/ne.png b/resources/icon/flags/ne.png new file mode 100644 index 0000000..6c42be5 Binary files /dev/null and b/resources/icon/flags/ne.png differ diff --git a/resources/icon/flags/net.png b/resources/icon/flags/net.png new file mode 100644 index 0000000..37c1bee Binary files /dev/null and b/resources/icon/flags/net.png differ diff --git a/resources/icon/flags/ng.png b/resources/icon/flags/ng.png new file mode 100644 index 0000000..4e39270 Binary files /dev/null and b/resources/icon/flags/ng.png differ diff --git a/resources/icon/flags/ni.png b/resources/icon/flags/ni.png new file mode 100644 index 0000000..ab154d4 Binary files /dev/null and b/resources/icon/flags/ni.png differ diff --git a/resources/icon/flags/nl.png b/resources/icon/flags/nl.png new file mode 100644 index 0000000..4195ae9 Binary files /dev/null and b/resources/icon/flags/nl.png differ diff --git a/resources/icon/flags/nn.png b/resources/icon/flags/nn.png new file mode 100644 index 0000000..76cea41 Binary files /dev/null and b/resources/icon/flags/nn.png differ diff --git a/resources/icon/flags/no.png b/resources/icon/flags/no.png new file mode 100644 index 0000000..76cea41 Binary files /dev/null and b/resources/icon/flags/no.png differ diff --git a/resources/icon/flags/np.png b/resources/icon/flags/np.png new file mode 100644 index 0000000..1efd2df Binary files /dev/null and b/resources/icon/flags/np.png differ diff --git a/resources/icon/flags/nr.png b/resources/icon/flags/nr.png new file mode 100644 index 0000000..ee3f13a Binary files /dev/null and b/resources/icon/flags/nr.png differ diff --git a/resources/icon/flags/nt.png b/resources/icon/flags/nt.png new file mode 100644 index 0000000..7bd40c2 Binary files /dev/null and b/resources/icon/flags/nt.png differ diff --git a/resources/icon/flags/nu.png b/resources/icon/flags/nu.png new file mode 100644 index 0000000..9d2d75c Binary files /dev/null and b/resources/icon/flags/nu.png differ diff --git a/resources/icon/flags/nz.png b/resources/icon/flags/nz.png new file mode 100644 index 0000000..9bdd98d Binary files /dev/null and b/resources/icon/flags/nz.png differ diff --git a/resources/icon/flags/om.png b/resources/icon/flags/om.png new file mode 100644 index 0000000..5588510 Binary files /dev/null and b/resources/icon/flags/om.png differ diff --git a/resources/icon/flags/org.png b/resources/icon/flags/org.png new file mode 100644 index 0000000..30dd64a Binary files /dev/null and b/resources/icon/flags/org.png differ diff --git a/resources/icon/flags/pa.png b/resources/icon/flags/pa.png new file mode 100644 index 0000000..cc4ae8d Binary files /dev/null and b/resources/icon/flags/pa.png differ diff --git a/resources/icon/flags/pe.png b/resources/icon/flags/pe.png new file mode 100644 index 0000000..e799dce Binary files /dev/null and b/resources/icon/flags/pe.png differ diff --git a/resources/icon/flags/pf.png b/resources/icon/flags/pf.png new file mode 100644 index 0000000..4f60b16 Binary files /dev/null and b/resources/icon/flags/pf.png differ diff --git a/resources/icon/flags/pg.png b/resources/icon/flags/pg.png new file mode 100644 index 0000000..4ea06e3 Binary files /dev/null and b/resources/icon/flags/pg.png differ diff --git a/resources/icon/flags/ph.png b/resources/icon/flags/ph.png new file mode 100644 index 0000000..d252607 Binary files /dev/null and b/resources/icon/flags/ph.png differ diff --git a/resources/icon/flags/pk.png b/resources/icon/flags/pk.png new file mode 100644 index 0000000..bc0ad13 Binary files /dev/null and b/resources/icon/flags/pk.png differ diff --git a/resources/icon/flags/pl.png b/resources/icon/flags/pl.png new file mode 100644 index 0000000..a6e3c56 Binary files /dev/null and b/resources/icon/flags/pl.png differ diff --git a/resources/icon/flags/pr.png b/resources/icon/flags/pr.png new file mode 100644 index 0000000..9abe52a Binary files /dev/null and b/resources/icon/flags/pr.png differ diff --git a/resources/icon/flags/pro.png b/resources/icon/flags/pro.png new file mode 100644 index 0000000..7bd40c2 Binary files /dev/null and b/resources/icon/flags/pro.png differ diff --git a/resources/icon/flags/ps.png b/resources/icon/flags/ps.png new file mode 100644 index 0000000..19157ee Binary files /dev/null and b/resources/icon/flags/ps.png differ diff --git a/resources/icon/flags/pt.png b/resources/icon/flags/pt.png new file mode 100644 index 0000000..06b747f Binary files /dev/null and b/resources/icon/flags/pt.png differ diff --git a/resources/icon/flags/py.png b/resources/icon/flags/py.png new file mode 100644 index 0000000..63afcaf Binary files /dev/null and b/resources/icon/flags/py.png differ diff --git a/resources/icon/flags/qa.png b/resources/icon/flags/qa.png new file mode 100644 index 0000000..ea078df Binary files /dev/null and b/resources/icon/flags/qa.png differ diff --git a/resources/icon/flags/re.png b/resources/icon/flags/re.png new file mode 100644 index 0000000..ad972bc Binary files /dev/null and b/resources/icon/flags/re.png differ diff --git a/resources/icon/flags/ro.png b/resources/icon/flags/ro.png new file mode 100644 index 0000000..26ea38a Binary files /dev/null and b/resources/icon/flags/ro.png differ diff --git a/resources/icon/flags/rs.png b/resources/icon/flags/rs.png new file mode 100644 index 0000000..98967d2 Binary files /dev/null and b/resources/icon/flags/rs.png differ diff --git a/resources/icon/flags/ru.png b/resources/icon/flags/ru.png new file mode 100644 index 0000000..a5b1a15 Binary files /dev/null and b/resources/icon/flags/ru.png differ diff --git a/resources/icon/flags/rw.png b/resources/icon/flags/rw.png new file mode 100644 index 0000000..ce8dc85 Binary files /dev/null and b/resources/icon/flags/rw.png differ diff --git a/resources/icon/flags/sa.png b/resources/icon/flags/sa.png new file mode 100644 index 0000000..15d1995 Binary files /dev/null and b/resources/icon/flags/sa.png differ diff --git a/resources/icon/flags/sb.png b/resources/icon/flags/sb.png new file mode 100644 index 0000000..5249207 Binary files /dev/null and b/resources/icon/flags/sb.png differ diff --git a/resources/icon/flags/sc.png b/resources/icon/flags/sc.png new file mode 100644 index 0000000..05950c2 Binary files /dev/null and b/resources/icon/flags/sc.png differ diff --git a/resources/icon/flags/sd.png b/resources/icon/flags/sd.png new file mode 100644 index 0000000..1af8740 Binary files /dev/null and b/resources/icon/flags/sd.png differ diff --git a/resources/icon/flags/se.png b/resources/icon/flags/se.png new file mode 100644 index 0000000..35aeb7b Binary files /dev/null and b/resources/icon/flags/se.png differ diff --git a/resources/icon/flags/sg.png b/resources/icon/flags/sg.png new file mode 100644 index 0000000..1ba1eeb Binary files /dev/null and b/resources/icon/flags/sg.png differ diff --git a/resources/icon/flags/si.png b/resources/icon/flags/si.png new file mode 100644 index 0000000..6bab773 Binary files /dev/null and b/resources/icon/flags/si.png differ diff --git a/resources/icon/flags/sk.png b/resources/icon/flags/sk.png new file mode 100644 index 0000000..98645d1 Binary files /dev/null and b/resources/icon/flags/sk.png differ diff --git a/resources/icon/flags/sl.png b/resources/icon/flags/sl.png new file mode 100644 index 0000000..3202cd8 Binary files /dev/null and b/resources/icon/flags/sl.png differ diff --git a/resources/icon/flags/sm.png b/resources/icon/flags/sm.png new file mode 100644 index 0000000..ce75b61 Binary files /dev/null and b/resources/icon/flags/sm.png differ diff --git a/resources/icon/flags/sn.png b/resources/icon/flags/sn.png new file mode 100644 index 0000000..1e86ff8 Binary files /dev/null and b/resources/icon/flags/sn.png differ diff --git a/resources/icon/flags/sr.png b/resources/icon/flags/sr.png new file mode 100644 index 0000000..230c0cc Binary files /dev/null and b/resources/icon/flags/sr.png differ diff --git a/resources/icon/flags/st.png b/resources/icon/flags/st.png new file mode 100644 index 0000000..789282b Binary files /dev/null and b/resources/icon/flags/st.png differ diff --git a/resources/icon/flags/su.png b/resources/icon/flags/su.png new file mode 100644 index 0000000..0b1b499 Binary files /dev/null and b/resources/icon/flags/su.png differ diff --git a/resources/icon/flags/sv.png b/resources/icon/flags/sv.png new file mode 100644 index 0000000..194a77a Binary files /dev/null and b/resources/icon/flags/sv.png differ diff --git a/resources/icon/flags/sy.png b/resources/icon/flags/sy.png new file mode 100644 index 0000000..abb980d Binary files /dev/null and b/resources/icon/flags/sy.png differ diff --git a/resources/icon/flags/sz.png b/resources/icon/flags/sz.png new file mode 100644 index 0000000..e4a33b0 Binary files /dev/null and b/resources/icon/flags/sz.png differ diff --git a/resources/icon/flags/tc.png b/resources/icon/flags/tc.png new file mode 100644 index 0000000..bf9d43d Binary files /dev/null and b/resources/icon/flags/tc.png differ diff --git a/resources/icon/flags/td.png b/resources/icon/flags/td.png new file mode 100644 index 0000000..de0df6d Binary files /dev/null and b/resources/icon/flags/td.png differ diff --git a/resources/icon/flags/tf.png b/resources/icon/flags/tf.png new file mode 100644 index 0000000..85c5591 Binary files /dev/null and b/resources/icon/flags/tf.png differ diff --git a/resources/icon/flags/tg.png b/resources/icon/flags/tg.png new file mode 100644 index 0000000..b9f6101 Binary files /dev/null and b/resources/icon/flags/tg.png differ diff --git a/resources/icon/flags/th.png b/resources/icon/flags/th.png new file mode 100644 index 0000000..2e8a282 Binary files /dev/null and b/resources/icon/flags/th.png differ diff --git a/resources/icon/flags/tk.png b/resources/icon/flags/tk.png new file mode 100644 index 0000000..ab79b28 Binary files /dev/null and b/resources/icon/flags/tk.png differ diff --git a/resources/icon/flags/tm.png b/resources/icon/flags/tm.png new file mode 100644 index 0000000..344049a Binary files /dev/null and b/resources/icon/flags/tm.png differ diff --git a/resources/icon/flags/tn.png b/resources/icon/flags/tn.png new file mode 100644 index 0000000..23ed954 Binary files /dev/null and b/resources/icon/flags/tn.png differ diff --git a/resources/icon/flags/to.png b/resources/icon/flags/to.png new file mode 100644 index 0000000..3289128 Binary files /dev/null and b/resources/icon/flags/to.png differ diff --git a/resources/icon/flags/tr.png b/resources/icon/flags/tr.png new file mode 100644 index 0000000..175d81a Binary files /dev/null and b/resources/icon/flags/tr.png differ diff --git a/resources/icon/flags/tt.png b/resources/icon/flags/tt.png new file mode 100644 index 0000000..f5dc69e Binary files /dev/null and b/resources/icon/flags/tt.png differ diff --git a/resources/icon/flags/tv.png b/resources/icon/flags/tv.png new file mode 100644 index 0000000..3f37936 Binary files /dev/null and b/resources/icon/flags/tv.png differ diff --git a/resources/icon/flags/tw.png b/resources/icon/flags/tw.png new file mode 100644 index 0000000..106d664 Binary files /dev/null and b/resources/icon/flags/tw.png differ diff --git a/resources/icon/flags/tz.png b/resources/icon/flags/tz.png new file mode 100644 index 0000000..a08c6f4 Binary files /dev/null and b/resources/icon/flags/tz.png differ diff --git a/resources/icon/flags/ua.png b/resources/icon/flags/ua.png new file mode 100644 index 0000000..aa20c83 Binary files /dev/null and b/resources/icon/flags/ua.png differ diff --git a/resources/icon/flags/ug.png b/resources/icon/flags/ug.png new file mode 100644 index 0000000..b86caaa Binary files /dev/null and b/resources/icon/flags/ug.png differ diff --git a/resources/icon/flags/uk.png b/resources/icon/flags/uk.png new file mode 100644 index 0000000..b83c204 Binary files /dev/null and b/resources/icon/flags/uk.png differ diff --git a/resources/icon/flags/um.png b/resources/icon/flags/um.png new file mode 100644 index 0000000..94ab2b6 Binary files /dev/null and b/resources/icon/flags/um.png differ diff --git a/resources/icon/flags/unknown.png b/resources/icon/flags/unknown.png new file mode 100644 index 0000000..85e4c4c Binary files /dev/null and b/resources/icon/flags/unknown.png differ diff --git a/resources/icon/flags/us.png b/resources/icon/flags/us.png new file mode 100644 index 0000000..865e458 Binary files /dev/null and b/resources/icon/flags/us.png differ diff --git a/resources/icon/flags/uy.png b/resources/icon/flags/uy.png new file mode 100644 index 0000000..4eb24e0 Binary files /dev/null and b/resources/icon/flags/uy.png differ diff --git a/resources/icon/flags/uz.png b/resources/icon/flags/uz.png new file mode 100644 index 0000000..56e95a8 Binary files /dev/null and b/resources/icon/flags/uz.png differ diff --git a/resources/icon/flags/va.png b/resources/icon/flags/va.png new file mode 100644 index 0000000..7bc573f Binary files /dev/null and b/resources/icon/flags/va.png differ diff --git a/resources/icon/flags/vc.png b/resources/icon/flags/vc.png new file mode 100644 index 0000000..042d5ab Binary files /dev/null and b/resources/icon/flags/vc.png differ diff --git a/resources/icon/flags/ve.png b/resources/icon/flags/ve.png new file mode 100644 index 0000000..bb14a3f Binary files /dev/null and b/resources/icon/flags/ve.png differ diff --git a/resources/icon/flags/vg.png b/resources/icon/flags/vg.png new file mode 100644 index 0000000..b95d418 Binary files /dev/null and b/resources/icon/flags/vg.png differ diff --git a/resources/icon/flags/vi.png b/resources/icon/flags/vi.png new file mode 100644 index 0000000..ceb9deb Binary files /dev/null and b/resources/icon/flags/vi.png differ diff --git a/resources/icon/flags/vn.png b/resources/icon/flags/vn.png new file mode 100644 index 0000000..7db2375 Binary files /dev/null and b/resources/icon/flags/vn.png differ diff --git a/resources/icon/flags/vu.png b/resources/icon/flags/vu.png new file mode 100644 index 0000000..1aa2dcd Binary files /dev/null and b/resources/icon/flags/vu.png differ diff --git a/resources/icon/flags/wf.png b/resources/icon/flags/wf.png new file mode 100644 index 0000000..205bebf Binary files /dev/null and b/resources/icon/flags/wf.png differ diff --git a/resources/icon/flags/wlk.png b/resources/icon/flags/wlk.png new file mode 100644 index 0000000..6def11d Binary files /dev/null and b/resources/icon/flags/wlk.png differ diff --git a/resources/icon/flags/ws.png b/resources/icon/flags/ws.png new file mode 100644 index 0000000..3b0d996 Binary files /dev/null and b/resources/icon/flags/ws.png differ diff --git a/resources/icon/flags/ye.png b/resources/icon/flags/ye.png new file mode 100644 index 0000000..70c3618 Binary files /dev/null and b/resources/icon/flags/ye.png differ diff --git a/resources/icon/flags/yt.png b/resources/icon/flags/yt.png new file mode 100644 index 0000000..f007cfd Binary files /dev/null and b/resources/icon/flags/yt.png differ diff --git a/resources/icon/flags/yu.png b/resources/icon/flags/yu.png new file mode 100644 index 0000000..b741ead Binary files /dev/null and b/resources/icon/flags/yu.png differ diff --git a/resources/icon/flags/za.png b/resources/icon/flags/za.png new file mode 100644 index 0000000..b4e1131 Binary files /dev/null and b/resources/icon/flags/za.png differ diff --git a/resources/icon/flags/ze.png b/resources/icon/flags/ze.png new file mode 100644 index 0000000..6955a4e Binary files /dev/null and b/resources/icon/flags/ze.png differ diff --git a/resources/icon/flags/zm.png b/resources/icon/flags/zm.png new file mode 100644 index 0000000..a489499 Binary files /dev/null and b/resources/icon/flags/zm.png differ diff --git a/resources/icon/flags/zw.png b/resources/icon/flags/zw.png new file mode 100644 index 0000000..78ad9d2 Binary files /dev/null and b/resources/icon/flags/zw.png differ diff --git a/resources/icon/os/macosx4.png b/resources/icon/os/macosx4.png new file mode 100644 index 0000000..777f350 Binary files /dev/null and b/resources/icon/os/macosx4.png differ diff --git a/resources/icon/os/macosx5.png b/resources/icon/os/macosx5.png new file mode 100644 index 0000000..777f350 Binary files /dev/null and b/resources/icon/os/macosx5.png differ diff --git a/resources/icon/os/macosx6.png b/resources/icon/os/macosx6.png new file mode 100644 index 0000000..777f350 Binary files /dev/null and b/resources/icon/os/macosx6.png differ diff --git a/resources/icon/os/macosx7.png b/resources/icon/os/macosx7.png new file mode 100644 index 0000000..777f350 Binary files /dev/null and b/resources/icon/os/macosx7.png differ diff --git a/resources/icon/os/macosx8.png b/resources/icon/os/macosx8.png new file mode 100644 index 0000000..777f350 Binary files /dev/null and b/resources/icon/os/macosx8.png differ diff --git a/resources/icon/os/macosx9.png b/resources/icon/os/macosx9.png new file mode 100644 index 0000000..777f350 Binary files /dev/null and b/resources/icon/os/macosx9.png differ diff --git a/tools/iwla_convert.pl b/tools/iwla_convert.pl index 696e230..2df1928 100755 --- a/tools/iwla_convert.pl +++ b/tools/iwla_convert.pl @@ -107,3 +107,5 @@ dumpHash(\%BrowsersHashIcon, $FIC, 1); print $FIC "}\n\n"; close($FIC); + +print "Done !\n"; diff --git a/tools/own_search_engines.pm b/tools/own_search_engines.pm index ff758a6..3a9b19f 100644 --- a/tools/own_search_engines.pm +++ b/tools/own_search_engines.pm @@ -4,6 +4,7 @@ 'windowssearch\.com', 'qwant\.com', 'wow\.com', +'duckduckgo\.com', 'searches\.omiga-plus\.com', 'buenosearch\.com', 'searches\.vi-view\.com' @@ -18,7 +19,8 @@ 'searches\.omiga-plus\.com', 'Omiga-plus', 'buenosearch\.com', 'Bueno Search', 'searches\.vi-view\.com', 'vi-view', - 'www.sfr\.fr\/recherche\/google', 'google' + 'www.sfr\.fr\/recherche\/google', 'google', + 'duckduckgo\.com', 'DuckDuckGo' ); %Own_SearchEnginesKnownUrl=( @@ -29,7 +31,9 @@ 'WOW', 'q=', 'Omiga-plus', 'q=', 'Bueno Search', 'q=', - 'vi-view', 'q=' + 'vi-view', 'q=', + # Know it's not good + 'DuckDuckGo', 'q=' );